使用group by计算R中列中子串的出现次数

时间:2018-02-19 14:01:38

标签: r grep summarize

我想计算列中每个组的字符串出现次数。在这种情况下,字符串通常是字符列中的子字符串。

我有一些数据,例如

ID   String              village
1    fd_sec, ht_rm,      A
2    NA, ht_rm           A
3    fd_sec,             B
4    san, ht_rm,         C

我开始使用的代码显然是不正确的,但是我没有在我的搜索中找到我可以在列中使用grep函数并按村庄分组

impacts <- se %>%  group_by(village) %>%
summarise(c_NA = round(sum(sub$en41_1 ==  "NA")),
          c_ht_rm = round(sum(sub$en41_1 ==  "ht_rm")),
          c_san = round(sum(sub$en41_1 ==  "san")),
          c_fd_sec = round(sum(sub$en41_1 ==  "fd_sec")))

理想情况下,我的输出是:

village  fd_sec  NA  ht_rm  san
A        1       1   2 
B        1
C                    1      1

提前谢谢

2 个答案:

答案 0 :(得分:5)

您也可以使用我的“splitstackshape”软件包中的cSplit()。由于此软件包还加载“data.table”,因此您只需使用dcast()将结果制成表格。

示例:

library(splitstackshape)
cSplit(mydf, "String", direction = "long")[, dcast(.SD, village ~ String)]
# Using 'village' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
#    village fd_sec ht_rm san NA
# 1:       A      1     2   0  1
# 2:       B      1     0   0  0
# 3:       C      0     1   1  0

答案 1 :(得分:4)

我们可以base R split使用&#39; String&#39;在&#39; village&#39;列中,然后拆分&#39; String&#39;通过在,后跟零个或多个空格(\\s*),stacklist拆分为两列data.frame并使用{获得频率 - 进入子字符串{1}}

table

或者使用table(stack(lapply(split(df1$String, df1$village), function(x) unlist(strsplit(x, ",\\s*"))))[2:1]) # values #ind fd_sec ht_rm NA san # A 1 2 1 0 # B 1 0 0 0 # C 0 1 0 1 ,在“乡村”分组后,重塑为“长”字样&#39;通过拆分&#39; String&#39;来格式化使用tidyverseseparate_rows将空白值排在&#39;字符串&#39;,filter频率和count到&#39;范围&# 39;格式

spread