如何在R中创建统计非NA文本字段数量的新变量behave?
问题:统计问卷开放式文本字段填写数量的简便R方法
我是心理学专业的R语言新手,正在分析一份末尾包含5个开放式文本字段的问卷。我希望统计每位参与者填写的文本字段数量,因此需要创建名为behave的新变量来存储该数据。
当前数据示例
# 目前的数据框类似这样(T表示文本字段已填写): S1 <- c(T,T,NA,T) S2 <- c(T,NA,NA,T) S3 <- c(T,NA,NA,NA) S4 <- c(T,NA,NA,NA) S5 <- c(NA,NA,NA,NA) # 组合为数据框 df <- data.frame(S1, S2, S3, S4, S5)
期望结果
# 想要得到的结果: S1 <- c(T,T,NA,T) S2 <- c(T,NA,NA,T) S3 <- c(T,NA,NA,NA) S4 <- c(T,NA,NA,NA) S5 <- c(NA,NA,NA,NA) behave <- c(4, 1, 0, 2) df_result <- data.frame(S1, S2, S3, S4, S5, behave)
我曾尝试使用ifelse函数实现,但该方法繁琐且容易出错,因此想询问是否有更简便的实现方式。
解决方案
方法1:基础R一行搞定
利用rowSums函数,R中TRUE等价于1,NA等价于0,配合na.rm=TRUE忽略缺失值,直接按行求和:
# 构造数据框 df <- data.frame(S1, S2, S3, S4, S5) # 添加behave变量 df$behave <- rowSums(df, na.rm = TRUE)
运行后df会自动新增behave列,值正好是每行已填写的文本字段数量。
方法2:tidyverse工具实现(适合后续批量处理)
如果习惯用tidyverse系列包(比如dplyr),可以用按行计算的方式:
library(dplyr) df <- df %>% rowwise() %>% mutate(behave = sum(c_across(S1:S5), na.rm = TRUE)) %>% ungroup()
rowwise()指定按行操作c_across(S1:S5)选中需要统计的5个文本字段列sum(..., na.rm=TRUE)计算每行非NA值的数量
内容的提问来源于stack exchange,提问作者justus
相关产品推荐
相关产品推荐

