编写函数统计多列分组中特定值的出现次数(R语言)
解决方法:按组统计每行特定值的列数
嘿,我来帮你搞定这个问题!你说的是手里有个包含多组调查题目的dataframe,想给每组统计每行里符合特定值的列数,但自己写的函数跑出了重复值列表还粘到原数据里了对吧?我猜大概率是你处理分组或者结果赋值的时候没控制好维度,导致重复输出了。下面给你两种靠谱的实现方式,还有踩坑的原因分析:
方式1:用dplyr快速实现(适合用tidyverse的朋友)
先补全你的示例数据(加了一列q0010的题,让分组更明显),假设你的分组是按列名前缀来的(比如q1/q2/q3是一组,q0010开头的是另一组),想要统计的特定值比如是3,代码可以这么写:
library(dplyr) # 补全后的示例数据 df <- structure( list( RespondentID = c(6764279930, 6779986023, 6760279439, 6759243066), q1 = c(3L, 3L, 4L, 1L), q2 = c(2L, 2L, 4L, 4L), q3 = c(4L, 2L, 4L, 5L), q0010_0004 = c(1L, 2L, 3L, 1L), q0010_0005 = c(3L, 1L, 2L, 3L) ), .Names = c("RespondentID", "q1", "q2", "q3", "q0010_0004", "q0010_0005"), class = "data.frame" ) # 先定义你要找的特定值 target_value <- 3 # 按组统计并新增列到原数据 df_result <- df %>% mutate( # 统计q1/q2/q3这组里等于target_value的列数 count_q_main = rowSums(across(starts_with("q") & !starts_with("q0010"), ~ .x == target_value)), # 统计q0010开头的组里等于target_value的列数 count_q0010 = rowSums(across(starts_with("q0010"), ~ .x == target_value)) ) print(df_result)
运行后会在原df后面新增两列,每一行对应各自组里等于3的列数,绝对不会出现重复值的问题。
方式2:基础R实现(不用额外装包)
要是你习惯用基础R,不想加载tidyverse,用grep选列+apply统计也能搞定:
# 同样用补全后的示例数据 df <- structure( list( RespondentID = c(6764279930, 6779986023, 6760279439, 6759243066), q1 = c(3L, 3L, 4L, 1L), q2 = c(2L, 2L, 4L, 4L), q3 = c(4L, 2L, 4L, 5L), q0010_0004 = c(1L, 2L, 3L, 1L), q0010_0005 = c(3L, 1L, 2L, 3L) ), .Names = c("RespondentID", "q1", "q2", "q3", "q0010_0004", "q0010_0005"), class = "data.frame" ) target_value <- 3 # 先找出每组对应的列索引 q_main_cols <- grep("^q[1-9]", names(df)) # 匹配q1/q2/q3,排除q0010开头的 q0010_cols <- grep("^q0010", names(df)) # 逐行统计每组里等于特定值的列数,直接赋值给新列 df$count_q_main <- apply(df[, q_main_cols], 1, function(x) sum(x == target_value)) df$count_q0010 <- apply(df[, q0010_cols], 1, function(x) sum(x == target_value)) print(df)
为啥你的原函数会出重复值?
我猜你大概率是犯了这个常见错误:把统计结果放进了列表里,然后绑定到df里,比如错误写法是这样的:
# 错误示例:把结果存成列表,导致每个单元格都是整个结果 df$count_group <- list(apply(df[, q_main_cols], 1, function(x) sum(x == target_value)))
这种写法会把整个统计向量塞进一个列表单元格里,看起来就是重复值。正确的做法是直接把向量赋值给新列,就像上面两种方式里那样,不要套列表!
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

