【问题标题】:R- create new dataframe variable from subset of two variables with missing data NAR-从缺少数据NA的两个变量的子集创建新的数据框变量
【发布时间】:2015-11-14 17:13:21
【问题描述】:

我有一个简单的示例数据框,其中包含两个数据列(data1 和 data2)和两个分组变量(度量 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] 中的错误:NA 不允许在下标作业中使用

接下来,我想将 data2 中的数据添加到 d$new 中,仅用于 Measure2 等于 4 的行。但是,Measure1 和 Measure2 中缺失的数据会导致数据子集化并将其分配给新变量时出现问题。我可以想到一些过于复杂的解决方案,但我敢肯定有一种我没有想到的简单方法。感谢您的帮助!

【问题讨论】:

    标签: r merge dataframe subset missing-data


    【解决方案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]
    

    或者,在 1 行中:

    d$new[d$Measure1 == 1 & !is.na(d$Measure1)] = d$data1[d$Measure1 == 1 & !is.na(d$Measure1)] 
    

    【讨论】:

      【解决方案2】:

      根据描述,OP 似乎希望基于两列创建一个“新”列,即当 Measure1==1 时,获取“data1”的相应元素,同样对于 Measure2==4,获取对应的“data2”值,其余的为NA。我们可以使用ifelse

       d$new <- with(d, ifelse(Measure1==1 & !is.na(Measure1), data1,
                                   ifelse(Measure2==4, data2, NA)))
      

      我们也可以通过分两步分配 (:=) 来使用 data.table 执行此操作。将“data.frame”转换为“data.table”(setDT(d))。基于逻辑条件(Measure1==1 &amp; !is.na(Measure1)),我们将列“new”分配为“data1”。这将使用来自 'data1' 的值创建列,因为逻辑条件为 TRUE,其余为 NA。在第二步中,我们使用 'Measure2/data2' 执行相同的操作。

       library(data.table) 
       setDT(d)[Measure1==1 & !is.na(Measure1), new:= data1]
       d[Measure2==4, new:= data2] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多