如何在DataFrame全列使用across函数?及rowSums相关问题求解
问题解决及原因解析
1. 遍历所有列统计TRUE次数
要让across遍历所有列,直接使用across(everything())即可,无需复杂语法。结合rowSums的正确写法如下:
dplyr管道版
# 通用写法(兼容非逻辑列) data_1 <- data_1 %>% mutate(True_Count = rowSums(across(everything(), ~ .x %in% TRUE), na.rm = TRUE)) # 若所有列都是逻辑型,可简化为 data_1 <- data_1 %>% mutate(True_Count = rowSums(across(everything()), na.rm = TRUE))
2. rowSums直接赋值无效的问题
你写的代码里存在变量名不匹配的错误:数据集是data_1,但代码里用了未定义的df,导致无法正确计算。修正后加上na.rm=TRUE避免NA干扰结果:
# 统计TRUE出现次数 data_1$True_Count <- rowSums(data_1 == TRUE, na.rm = TRUE) # 统计字符串"banana"出现次数 data_1$True_Count <- rowSums(data_1 == "banana", na.rm = TRUE)
注意:统计字符串时要确保目标列是字符型,否则比较结果会全为FALSE。
3. 重复运行原代码计数错误的原因
第一次运行后,data_1新增了True_Count数值列。第二次运行时,across(-c(Community.name))会包含这个新增列,而R中数值1等价于TRUE(1 == TRUE返回TRUE),每次重复运行都会把上一次的统计结果也计入,导致计数累加变大。
解决方法二选一:
- 每次运行前删除已存在的
True_Count列:if ("True_Count" %in% colnames(data_1)) data_1$True_Count <- NULL data_1 <- data_1 %>% mutate(True_Count = rowSums(across(-c(Community.name), `%in%`, TRUE), na.rm = TRUE)) - 在
across中明确排除True_Count:data_1 <- data_1 %>% mutate(True_Count = rowSums(across(-c(Community.name, True_Count), `%in%`, TRUE), na.rm = TRUE))
内容的提问来源于stack exchange,提问作者plast1cd0nk3y
相关产品推荐
相关产品推荐

