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

在R语言中从现有列随机取值生成完整新列的方法求助

问题描述

我是R语言新手,手里有一份包含五年数据的表格,各年份单元格存在随机缺失值。想在数据后新增三个列size、weight、gender,每列的每个值都从对应指标的各年份列里随机挑非缺失值填充,保证新列没有缺失。数据集示例如下:

Individualsize 2010weight 2010gender 2010size 2011weight 2011gender 2011size 2012weight 2012gender 2012
A10050M10055M10165M
B75NAF75NAF7560F
C9065F9067FNA70F
DNA70NANA50MNA55NA
ENANANANANANA12070M

基础R实现方案

适合刚接触R的新手,无需额外安装包:

  1. 先提取每个指标的所有非缺失值,形成备选抽样池

    # 假设你的数据集名为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))]))
    
  2. 给原数据集新增列,从备选池随机抽样填充(允许重复抽取)

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:36:21