Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用group by计算R列中子字符串的出现次数_R_Summarize - Fatal编程技术网

使用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*”)中得到
错误:非字符参数
。@jaySf
strsplit
采用
字符
列。如果是
因子
do
strsplit(如字符(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