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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:13:23