2016-10-13 3 views
1

트윗에 사용되는 해시 태그의 데이터 세트가 있습니다. 각 행은 특정 짹짹이고 각 변수는 각 짹짹에 사용되는 다른 해시 태그입니다. 그래서 많은 변수가 일부 관측에서는 비어 있습니다. 왜냐하면 그들은 hasthags가 적기 때문입니다. 나의 궁극적 인 목표는 가장 인기있는 3 가지 해시 태그의 동시 발생을 확인하는 것이지만, 먼저이 트윗이 이러한 top3 해시 태그를 사용하는지 확인하고자한다.일치하는 문자열 목록 찾기

내 데이터 세트는 다음과 같은 :

V1 | V2 | V3 |  top3 
    nyc|  |  | nyc, cool, nyc2016 
    cool| nyc |  | nyc, cool, nyc2016 
    hello| cool | nyc | nyc, cool, nyc2016 
winter| nyc |  | nyc, cool, nyc2016 

그래서이 예에서 상위 3 해시 태그 안녕하세요 겨울 뉴욕 시원했다,하지만. 각 해시 태그가

df1<-sapply(df$V1, function(x) grepl(sprintf('\\b%s\\b', x), df$top3)) 

을 수행하여 TOP3 중 하나였습니다 경우

내가 보는 노력하지만 너무 오래하고있다. 그리고 나서 V2와 V3 (루프를 수행 할 수 있지만 실행하는 데 더 오래 걸릴 수 있음)에서이 작업을 수행해야합니다.

제안 사항?

+0

'sapply ($ V1 DF, 기능 (x)는 X %에서 % 올라가지 (strsplit (안양 $의 TOP3, "")))'? – JasonAizkalns

답변

3

우리는 안전하게 top3는 데이터 집합의 고유 한 가정 할 수

당신은 다음을 수행는 열 각각에 대한 TRUE/FALSE 값을 갖고 싶어? 그렇다면 :

df <- read.table(
    textConnection(" V1 | V2 | V3 |  top3 
    nyc|  |  | nyc, cool, nyc2016 
    cool| nyc |  | nyc, cool, nyc2016 
    hello| cool | nyc | nyc, cool, nyc2016 
winter| nyc |  | nyc, cool, nyc2016"), 
    sep = "|", header = TRUE, stringsAsFactors = FALSE, strip.white = TRUE) 
library(dplyr) ; library(stringr) 
top <- str_split(df$top3[[1]], pattern = ", ")[[1]] 
is_in_top <- function(x) x %in% top 
mutate_each(df, funs(is_in_top), vars = V1:V3) 
+0

완벽한 작업과 초고속! 루프를 사용하는 나의 초기 생각보다 훨씬 낫다. –

1

나는 이러한 작업을 수행하기 전에 정규화 된 데이터 또는 긴 데이터를 항상 가져 오려고합니다. 내 데이터가 훨씬 더 융통성있게 느껴진다. 그 결과 많은 단어가 상단에 얼마나 카운트로 요약 한 것입니다

id  n_in_top3 
(int)  (dbl) 
1   1 
2   2 
3   2 
4   1 

:에

library(dplyr) 
library(tidyr) 


df <- data.frame(v1 = c('nyc','cool','hello','winter') 
       ,v2 = c(NA,'nyc','cool','nyc') 
       ,v3 = c(NA,NA,'nyc',NA) 
       ,stringsAsFactors = F) 
top3 <- c('nyc','cool','nyc2016') 

df %>% mutate(id = row_number()) %>% gather(n, word,-id) %>% 
    filter(!is.na(word)) %>% group_by(id) %>% 
    summarise(n_in_top3 = sum(ifelse(word %in% top3,1,0))) 

결과 : 아마 주석에 언급 된 솔루션도 작동하지만, 내 솔루션을 공유하고 데이터의 각 행에 대해 3 단어 목록. 제공

df %>% mutate(id = row_number()) %>% gather(n, word,-id) %>% 
    filter(!is.na(word)) %>% group_by(id, n) %>% 
    summarise(n_in_top3 = (word %in% top3)) %>% 
    spread(n, n_in_top3) 

는 :

id v1  v2  v3 
<int> <lgl> <lgl> <lgl> 
1  TRUE NA  NA 
2  TRUE TRUE NA 
3  FALSE TRUE TRUE 
4  FALSE TRUE NA 
+0

감사! 이것은 효과가 있었지만 사용 된 각 태그를 식별해야했습니다. 내 질문에 명확하지 않은 경우 미안합니다. 그러나 본질적으로, 내가 사용한 아래의 대답은 당신과 같습니다. –

+0

내 aners를 조정했습니다. 당연히 취향의 문제입니다. 모든 길은 로마로 연결됩니다. – Wietze314

+0

맙소사, 이건 내가 필요로했던 것, 멋져! –

관련 문제