我想计算列中每个组的字符串出现次数。在这种情况下,字符串通常是字符列中的子字符串。
我有一些数据,例如
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
提前谢谢
答案 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*
),stack
将list
拆分为两列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;来格式化使用tidyverse
,separate_rows
将空白值排在&#39;字符串&#39;,filter
频率和count
到&#39;范围&# 39;格式
spread