You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按规则填充数据框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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:13:07