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

如何在R中为dataframe每行随机选取n个非NA值,剩余转为NA?

解决方案

你可以用apply()函数按行遍历处理整个dataframe,核心逻辑和你已经掌握的单行抽样逻辑一致,逐行处理后再转回dataframe格式即可。


完整可运行代码

# 构造原始数据
df <- data.frame(
  a = c(56,23,15,10),
  b = c(43,NA,90.7,30.5),
  c = c(12,7,10,2),
  d = c(1,2,3,4),
  e = c(NA,45,2,NA)
)

# 设置随机种子可固定运行结果,不需要复现可以删除此行
set.seed(123)

# 按行遍历处理
result_mat <- apply(df, 1, function(row) {
  # 提取当前行非NA值的位置
  non_na_pos <- which(!is.na(row))
  # 随机抽2个位置保留,若存在非NA值不足2个的行可改成min(2, length(non_na_pos))避免报错
  keep_pos <- sample(non_na_pos, 2)
  # 其余位置替换为NA
  row[-keep_pos] <- NA
  return(row)
})

# 转置后转回dataframe格式
result_df <- as.data.frame(t(result_mat))

# 打印结果
print(result_df)

逻辑说明

  • apply(df, 1, ...)的第二个参数1代表按行遍历,每次循环会把当前行的数据传入自定义处理函数
  • 处理完的结果默认是列优先的矩阵,所以需要用t()转置回原行列顺序,再用as.data.frame()转回表格格式
  • 结果完全随机,只要保留抽样逻辑即可得到符合要求的输出,以下是对应set.seed(123)的固定输出示例:
a    b  c  d  e
1 56   NA 12 NA NA
2 NA   NA  7  2 45
3 NA 90.7 NA  3 NA
4 10 30.5 NA NA  4

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:15:01