我有一个简单的示例数据框,包含两个数据列(data1和data2)和两个分组变量(Measure 1和2)。测量1和2缺少数据NA。
d <- data.frame(Measure1 = 1:2, Measure2 = 3:4, data1 = 1:10, data2 = 11:20)
d$Measure1[4]=NA
d$Measure2[8]=NA
d
Measure1 Measure2 data1 data2
1 1 3 1 11
2 2 4 2 12
3 1 3 3 13
4 NA 4 4 14
5 1 3 5 15
6 2 4 6 16
7 1 3 7 17
8 2 NA 8 18
9 1 3 9 19
10 2 4 10 20
我想创建一个包含data1的新变量(d$new
),但仅适用于Measure1等于1的行。我试过这个并得到以下错误:
d$new[d$Measure1 == 1] = d$data1[d$Measure1 == 1]
d $ new [d $ Measure1 == 1] = d $ data1 [d $ Measure1 == 1]:NAs出错 在下标作业中不允许
接下来,我想在数据2中添加d $ new数据仅适用于Measure2等于4的行。但是,Measure1和Measure2中缺少的数据导致数据子集化并将其分配给新变量时出现问题。我可以想到一些过于复杂的解决方案,但我确信这是一个我没想到的简单方法。谢谢你的帮助!
答案 0 :(得分:1)
查找Measure1不是NA的行,并且是您想要的值。
measure1_notNA = which(!is.na(d$Measure1) & d$Measure1 == 1)
使用默认值初始化新列。
d$new = NA
仅替换data1列中具有相应值的那些行。
d$new[measure1_notNA] = d$data1[measure1_notNA]
或者,在一行中:
d$new[d$Measure1 == 1 & !is.na(d$Measure1)] = d$data1[d$Measure1 == 1 & !is.na(d$Measure1)]
答案 1 :(得分:0)
根据描述,似乎OP想要创建一个列&#39; new&#39;基于两列,即当Measure1 == 1时,得到&lt; data1&#39;的相应元素,类似于Measure2 == 4,得到相应的数据2&#39;值{,其余为float()
。我们可以使用NA
ifelse
我们也可以通过两个步骤分配( d$new <- with(d, ifelse(Measure1==1 & !is.na(Measure1), data1,
ifelse(Measure2==4, data2, NA)))
)来data.table
执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (:=
)。根据逻辑条件(setDT(d)
),我们会分配“&#39; new&#39; as&#39; data1&#39;。这将创建包含来自&#39; data1&#39;的值的列。因为逻辑条件为Measure1==1 & !is.na(Measure1)
,其余为TRUE
。在第二步中,我们使用&#39; Measure2 / data2&#39;。
NA