问题描述
这是我的问题。我有这个数据框:
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