在R语言中从现有列随机取值生成完整新列的方法求助
问题描述
我是R语言新手,手里有一份包含五年数据的表格,各年份单元格存在随机缺失值。想在数据后新增三个列size、weight、gender,每列的每个值都从对应指标的各年份列里随机挑非缺失值填充,保证新列没有缺失。数据集示例如下:
| Individual | size 2010 | weight 2010 | gender 2010 | size 2011 | weight 2011 | gender 2011 | size 2012 | weight 2012 | gender 2012 |
|---|---|---|---|---|---|---|---|---|---|
| A | 100 | 50 | M | 100 | 55 | M | 101 | 65 | M |
| B | 75 | NA | F | 75 | NA | F | 75 | 60 | F |
| C | 90 | 65 | F | 90 | 67 | F | NA | 70 | F |
| D | NA | 70 | NA | NA | 50 | M | NA | 55 | NA |
| E | NA | NA | NA | NA | NA | NA | 120 | 70 | M |
基础R实现方案
适合刚接触R的新手,无需额外安装包:
先提取每个指标的所有非缺失值,形成备选抽样池
# 假设你的数据集名为df,替换成你实际的数据集名称 # 提取所有size列的非缺失值 size_pool <- na.omit(unlist(df[, grepl("size", colnames(df))])) # 提取所有weight列的非缺失值 weight_pool <- na.omit(unlist(df[, grepl("weight", colnames(df))])) # 提取所有gender列的非缺失值 gender_pool <- na.omit(unlist(df[, grepl("gender", colnames(df))]))给原数据集新增列,从备选池随机抽样填充(允许重复抽取)
df$size <- sample(size_pool, nrow(df), replace = TRUE) df$weight <- sample(weight_pool, nrow(df), replace = TRUE) df$gender <- sample(gender_pool, nrow(df), replace = TRUE)
tidyverse实现方案
如果习惯用tidyverse生态,代码更简洁:
先安装并加载包(未安装的话先执行install.packages("tidyverse"))
library(tidyverse)
一行代码完成新增列:
df <- df %>% mutate( size = sample(na.omit(c_across(starts_with("size"))), n(), replace = TRUE), weight = sample(na.omit(c_across(starts_with("weight"))), n(), replace = TRUE), gender = sample(na.omit(c_across(starts_with("gender"))), n(), replace = TRUE) )
注意事项
- 必须确保每个指标(size/weight/gender)至少有一个非缺失值,否则抽样会报错。可提前检查:
if (length(size_pool) == 0) stop("所有size年份列都没有非缺失值,请检查数据!") if (length(weight_pool) == 0) stop("所有weight年份列都没有非缺失值,请检查数据!") if (length(gender_pool) == 0) stop("所有gender年份列都没有非缺失值,请检查数据!")
内容的提问来源于stack exchange,提问作者TeaNoMilk
相关产品推荐
相关产品推荐

