使用group by计算R列中子字符串的出现次数
我想计算一列中字符串的出现次数…每组。在这种情况下,字符串通常是字符列中的子字符串 我有一些数据使用group by计算R列中子字符串的出现次数,r,summarize,R,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 <
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")))
提前谢谢我们可以通过
拆分将“String”列拆分为“village”,然后通过在处拆分将“String”拆分为子字符串,
后跟零个或多个空格(\\s*
),将列表
堆叠成两列data.frame
并使用表
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
或者使用tidyverse
,在按“村庄”分组后,通过使用分隔行
,筛选出在“字符串”中有空白值的行,计数
频率和将其扩展为“宽”格式,将“字符串”拆分为“长”格式
library(dplyr)
library(tidyr)
df1 %>%
group_by(village) %>%
separate_rows(String, sep=",\\s*") %>%
filter(nzchar(String)) %>%
count(village, String) %>%
spread(String, n, fill = 0)
# A tibble: 3 x 5
# Groups: village [3]
# village fd_sec ht_rm `NA` san
#* <chr> <dbl> <dbl> <dbl> <dbl>
#1 A 1.00 2.00 1.00 0
#2 B 1.00 0 0 0
#3 C 0 1.00 0 1.00
库(dplyr)
图书馆(tidyr)
df1%>%
组别(乡村)%>%
分隔行(字符串,sep=“,\\s*”)%>%
过滤器(nzchar(字符串))%>%
计数(村庄、字符串)%%>%
排列(字符串,n,填充=0)
#一个tibble:3x5
#组别:乡村[3]
#村庄fd_sec ht_rm`NA`san
#*
#1A 1.00 2.00 1.00 0
#2b1.00
#3 C 0 1.00 0 1.00
您也可以使用我的“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
拆分“字符串”列并制表。你应该发布一些。我会用c_ht_rm=length(grep(“ht_rm”,String))
来总结每个子字符串。可复制数据-我将在将来这样做。我从基本R版本的strsplit(x,“,\\s*”)中得到错误:非字符参数
。@jaySfstrsplit
采用字符
列。如果是因子
dostrsplit(如字符(x),“,\\s*”)
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