2017-02-13 2 views
4

これは重複していますが、私の問題を把握することはできませんでした。文字列に特定のテキストが含まれている場合は集計R

私は

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

を持っており、次のようにnamegroup

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

1つの方法は、2つのステップで

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

私は可能性がある場合、いくつかの速度の改善? (df [grep(パターン= x、x = df $ name、fixed = TRUE)、 "count"]))))))data.frame(group = group、count = ) '(' do.call'で必要ないか、各繰り返し内で 'data.frame'を作成し、' fixed = TRUE'などを追加します) –

0

tidyverseパッケージpurrrdplyrtidyrを用い方法:

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

私は同意します。余分なレベルを含む答えを修正しました。 –

関連する問題