R - 在条件索引中处理 NA 以求和行

问题描述

这是我的问题。我有这个数据框:

C1  C1a  A1_1  A1a
2   560     0   NA
2   365     1  400
1    NA     1    0
1    NA     0   NA
3   250     1  300    
1    NA     1  500
NA 1125     0   NA
4   700     0   NA
NA   NA     1  750
7    NA     1   50
5   500     0   NA
6   325     0   NA

我想创建一个具有以下条件的新列“NEW”:

If d$A1_1 == 0 -> d$NEW == 0
If d$A1_1 == 1 -> 2 solutions :
a) if d$C1 = 2 or 3 or 4 or 5 or 6 -> d$NEW == A1a
b) if d$C1 == 1 or 7 -> d$NEW == d$A1a + (mean(d$C1a) for individuals d$C1 == 2 or 3 or 4 or 5 or 6)

使用 R 基本代码,如果没有 NA,可能是这样:

d$NEW[d$A1_1 == 0] <- 0
d$NEW[d$C1== 1 | d$C1== 7] <- A1a[d$C1== 1 | d$C1== 7] + mean(d$C1a[d$C1== 2 | d$C1== 3 | d$C1== 4 | d$C1== 5 | d$C1== 6],na.rm = TRUE)
d$NEW[d$C1== 2 | d$C1== 3 | d$C1== 4 | d$C1== 5 | d$C1== 6] <- A1a[d$C1== 2 | d$C1== 3 | d$C1== 4 | d$C1== 5 | d$C1== 6]

但是在这种情况下有很多 NA,并且索引是不可能的。 有没有一个简单的解决方案来处理这个问题,而无需在 0 中转换 NA ?

这是在 R 中导入此结构的代码

d <- structure(list(C1 = c(2L,2L,1L,3L,NA,4L,7L,5L,6L),C1a = c(560L,365L,250L,1125L,700L,500L,325L),A1_1 = c(0L,0L,0L),A1a = c(NA,400L,300L,750L,50L,NA)),.Names = c("C1","C1a","A1_1","A1a"),class = "data.frame",row.names = c(NA,-12L))

解决方法

我不太确定您在寻找什么,但我认为您正在寻找 %in% 而非 ==

d <- within(d,{
  NEW <- NA
  NEW[C1 %in% c(1,7)] <- A1a[C1 %in% c(1,7)] + mean(C1a[!C1 %in% 1],na.rm=TRUE)
  NEW[!C1 %in% c(1,7)] <- A1a[!C1 %in% c(1,7)] 
})
d
#    C1  C1a A1_1 A1a       NEW
# 1   2  560    0  NA        NA
# 2   2  365    1 400  400.0000
# 3   1   NA    1   0  546.4286
# 4   1   NA    0  NA        NA
# 5   3  250    1 300  300.0000
# 6   1   NA    1 500 1046.4286
# 7  NA 1125    0  NA        NA
# 8   4  700    0  NA        NA
# 9  NA   NA    1 750  750.0000
# 10  7   NA    1  50  596.4286
# 11  5  500    0  NA        NA
# 12  6  325    0  NA        NA