2017-02-13 9 views
4

이 주제에 대한 많은 게시물을 보았습니다. 그렇다면이 문제는 중복되었지만 문제를 파악할 수 없었습니다.문자열에 특정 텍스트가 포함 된 경우 집계 R

나는

df <- data.frame(name = c('bike+ride','shoe+store','ride','mountian%20bike','ride+along'), 
      count = c(2,5,8,7,6)) 

을 가지고 있으며 name 다음과 같이 group

group <- data.frame(group = c('ride','bike')) 

그래서 최종 결과가 보이는 문자열이 포함 된 경우 각 count을 합계를 :

Group Count 
bike  9 
ride  16 

수있는 사람을 도움?

답변

3

베이스 R 아이디어,

sapply(sapply(as.character(group$group), function(i) grep(i, df$name)), function(i) sum(df$count[i])) 


#or make it a function 

aggr1 <- function(var1, grp, cnt){ 
    m1 <- sapply(as.character(grp), function(i) grep(i, var1)) 
    final_d <- sapply(m1, function(i) sum(cnt[i])) 
    return(data.frame(Group = names(final_d), 
        Count = as.integer(final_d), stringsAsFactors = FALSE) 
     ) 
} 

aggr1(df$name, group$group, df$count) 

# Group Count 
#1 ride 16 
#2 bike  9 
+0

감사합니다. 어떻게 이름에'+'또는'% 20' 문자가 포함 된 인스턴스를 어떻게 처리 할까? – Davis

+0

예제에서 이름에 해당 문자가 있고 예상대로 작동합니다. – Sotos

1

한 가지 방법은 두 단계에서

do.call(rbind, sapply(group$group, FUN = function(x, df) { 
    out <- df[grepl(pattern = x, x = df$name), ] 
    data.frame(group = x, count = sum(out$count)) 
}, df = df, simplify = FALSE)) 

    group count 
1 ride 16 
2 bike  9 

입니다 :

# make a data.frame which locates where each group level is located 
grp <- as.data.frame(sapply(group$group, FUN = function(x) grepl(pattern = x, x = df$name))) 
names(grp) <- group$group 

# based on above location (TRUE/FALSE), sum accordingly 
data.frame(count = apply(grp, MARGIN = 2, FUN = function(x, df) { 
    sum(df[x, "count"]) 
}, df = df)) 

    count 
ride 16 
bike  9 
+0

내가 할 수있는 경우 속도가 약간 향상 되었습니까? (count = df $ name, fixed = TRUE), "count"])))) data.frame (group = group, count = sapply (그룹 $ 그룹, FUN =)'('do.call'이나 각 반복 내에서'data.frame'을 만들지 말고'fixed = TRUE' 등을 추가하십시오) –

0

tidyverse 패키지 purrr, dplyrtidyr 사용하는 방법 :

library(tidyverse) # for dplyr, purr and tidyr 

groups <- c('ride','bike') 

map_df(groups, ~setNames(summarize_(df, interp(~sum(df$count[grepl(var, name)], na.rm = TRUE), var = .x)), .x)) %>% 
     gather(group, count, na.rm = TRUE) 
+0

여분의'group $ group' 레벨을 포함 할 때 꽤 보행자 인 것 같습니다 . –

+0

동의합니다. 추가 수준을 포함하는 답변을 수정했습니다. –