R-从缺少数据NA的两个变量的子集创建新的数据帧变量

时间:2015-08-20 21:33:23

标签: r merge dataframe subset missing-data

我有一个简单的示例数据框,包含两个数据列(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中缺少的数据导致数据子集化并将其分配给新变量时出现问题。我可以想到一些过于复杂的解决方案,但我确信这是一个我没想到的简单方法。谢谢你的帮助!

2 个答案:

答案 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