在R数据框中统计已填充的Team_x列数并生成新列
统计R数据框中每行非NA的Team_x列数量
我有一个名为df_team的R数据框,包含上百组Team_x和Team_URL_x格式的列,部分Team_x列存在NA值。需要新增Team_Count列,统计每行中非NA的Team_x列数量,以此获取每个Project对应的团队成员数。
数据框结构
dput(df_team) structure(list(Project = c("etwbv", "werg", "sdfg", "qwreg", "cae", "refdc"), Team_1 = c("ewrg", "werg", "asd", "qwe", NA, "vsfd"), Team_URL_1 = c("abc", "bfh", "fse", "rege", NA, "vsefr" ), Team_2 = c("abc1", "bfh", "fse", "rege1", NA, NA), Team_URL_2 = c("abc", "bfh", "fse", "rege", NA, NA), Team_3 = c("abc1", "bfh", NA, NA, NA, NA), Team_URL_3 = c("abc", "bfh", NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -6L))
预期结果
Project Team_1 Team_URL_1 Team_2 Team_URL_2 Team_3 Team_URL_3 Team_Count etwbv ewrg abc abc1 abc abc1 abc 3 werg werg bfh bfh bfh bfh bfh 3 sdfg asd fse fse fse NA NA 2 qwreg qwe rege rege1 rege NA NA 2 cae NA NA NA NA NA NA 0 refdc vsfd vsefr NA NA NA NA 1
解决方案
方法1:Base R
通过正则匹配筛选出所有Team_x格式的列,再逐行统计非NA值的数量:
# 筛选所有Team_x列(排除Team_URL_x) team_cols <- grep("^Team_\\d+$", names(df_team), value = TRUE) # 新增Team_Count列 df_team$Team_Count <- rowSums(!is.na(df_team[team_cols]))
方法2:dplyr包
使用dplyr的语法更简洁地完成操作:
library(dplyr) df_team <- df_team %>% mutate(Team_Count = rowSums(!is.na(select(., starts_with("Team_") & matches("\\d+$")))))
说明
- 正则表达式
^Team_\\d+$用于精准匹配Team_后接数字的列,确保只统计Team_x而不包含Team_URL_x。 !is.na()将非NA值转换为逻辑值TRUE(对应数值1),NA值转换为FALSE(对应数值0),rowSums()对每行求和即可得到非NA的Team_x列数量。
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

