如何按规则填充数据框NA值并更新指定列的变量值?
R数据框处理解决方案
问题描述
现有如下R数据框df:
df <- structure(list(Grade = c("A", "A", "B", "B"), Pass = c("Y", "N", "Y", "N"), A1 = c(7, 8, NA, NA), A2 = c(4, 5, NA, NA), A3 = c(9, NA, NA, NA), B1 = c(NA, NA, 8, NA), B2 = c(NA, NA, 3, 4)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
需要完成两项操作:
- 若列名首字母与
Grade列的值匹配,且当前值为NA,则将其替换为0; - 将
A1至B2列的数值更新为:当前值 * 100 / 列总和(列总和用colSums()计算)。
实现步骤与代码
我们可以用dplyr包高效完成这两项操作,以下是具体实现:
步骤1:替换符合条件的NA为0
按行遍历数据,对A1到B2的列判断:如果列名首字母和当前行的Grade值一致,且当前值是NA,就替换成0:
library(dplyr) # 第一步处理:替换指定NA为0 df_step1 <- df %>% rowwise() %>% mutate(across(A1:B2, ~ifelse(substr(cur_column(), 1, 1) == Grade & is.na(.), 0, .))) %>% ungroup()
步骤2:计算列占比
先计算处理后数据中A1到B2各列的总和,再将每个数值转换为占列总和的百分比:
# 第二步处理:计算百分比占比 df_final <- df_step1 %>% mutate(across(A1:B2, ~.x * 100 / colSums(select(., A1:B2), na.rm = TRUE)[cur_column()]))
完整合并代码
将两步整合,直接得到最终结果:
library(dplyr) df <- structure(list(Grade = c("A", "A", "B", "B"), Pass = c("Y", "N", "Y", "N"), A1 = c(7, 8, NA, NA), A2 = c(4, 5, NA, NA), A3 = c(9, NA, NA, NA), B1 = c(NA, NA, 8, NA), B2 = c(NA, NA, 3, 4)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) df_final <- df %>% rowwise() %>% mutate(across(A1:B2, ~ifelse(substr(cur_column(), 1, 1) == Grade & is.na(.), 0, .))) %>% ungroup() %>% mutate(across(A1:B2, ~.x * 100 / colSums(select(., A1:B2), na.rm = TRUE)[cur_column()])) # 查看最终结果 print(df_final)
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

