基于R语言改写数据框中V3与V4均为1的观测值需求
R语言处理数据框指定行的随机赋值需求
问题背景
现有数据框df,包含字段V1、V2(唯一ID)、V3、V4(疾病状态),原始数据如下:
V1 V2 V3 V4 101 201 1 1 102 202 1 1 103 203 2 NA 104 204 1 2 105 205 1 1 106 206 1 1 107 207 2 NA 108 208 1 1 109 209 2 1 110 210 2 2 111 211 2 NA 112 212 NA 2 113 213 1 1 114 214 1 1 115 215 2 NA
需遵循以下处理规则:
- 仅处理V3和V4均为1的行:将这类行随机设置为
V3=1且V4=NA,或V3=NA且V4=1 - 必须保证处理后V3中1的总数多于V4中1的总数
- 其他组合(如1和2、2和1、NA和2等)不做修改
R语言实现方案
步骤1:构造原始数据框(已有数据可跳过)
将示例数据转换为R数据框:
df <- data.frame( V1 = c(101,102,103,104,105,106,107,108,109,110,111,112,113,114,115), V2 = c(201,202,203,204,205,206,207,208,209,210,211,212,213,214,215), V3 = c(1,1,2,1,1,1,2,1,2,2,2,NA,1,1,2), V4 = c(1,1,NA,2,1,1,NA,1,1,2,NA,2,1,1,NA), stringsAsFactors = FALSE )
步骤2:核心处理逻辑
# 设置随机种子保证结果可复现 set.seed(123) # 筛选出V3和V4均为1的行索引 target_idx <- which(df$V3 == 1 & df$V4 == 1) n_target <- length(target_idx) # 计算V3需要保留1的数量:确保数量多于V4,取目标行数的向上取整值 n_v3_keep <- ceiling(n_target / 2) # 若需严格多1个,可替换为:n_v3_keep <- ifelse(n_target %% 2 ==0, n_target/2 +1, ceiling(n_target/2)) # 随机选择要保留V3=1的行 v3_keep_idx <- sample(target_idx, n_v3_keep) # 剩余行保留V4=1 v4_keep_idx <- setdiff(target_idx, v3_keep_idx) # 修改数据框对应字段 df[v3_keep_idx, "V4"] <- NA df[v4_keep_idx, "V3"] <- NA
验证结果
查看处理后的数据框:
print(df)
输出示例(因固定随机种子,结果可复现):
V1 V2 V3 V4 1 101 201 1 NA 2 102 202 NA 1 3 103 203 2 NA 4 104 204 1 2 5 105 205 1 NA 6 106 206 1 NA 7 107 207 2 NA 8 108 208 NA 1 9 109 209 2 1 10 110 210 2 2 11 111 211 2 NA 12 112 212 NA 2 13 113 213 1 NA 14 114 214 NA 1 15 115 215 2 NA
可通过以下代码验证V3和V4中1的数量:
sum(df$V3 ==1, na.rm = TRUE) sum(df$V4 ==1, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

