gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:22:53 24 4
gpt4 key购买 nike

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

我有一些数据,例如

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

提前谢谢你

最佳答案

我们可以通过 base R 做到这一点由 split将 'String' 列与 'village' 匹配,然后通过在 , 处拆分将 'String' 拆分为子字符串后跟零个或多个空格( \\s* ),stack list分成两列data.frame并通过 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

或使用 tidyverse ,按“村庄”分组后,通过使用 separate_rows 拆分“字符串”重新整形为“长”格式, filter找出'String'中具有空白值的行,count频率和spread它为“宽”格式

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

关于r - 使用 group by 计算 R 中列中子字符串的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48867843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com