如何在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
相关产品推荐
相关产品推荐

