我的数据如下:
y<-data.frame(atp=c(1,0,1,0,0,1),
ssmin=c(2,NA,3,NA,NA,1),
Day_1=round(runif(6,5,11),0),
Day_2=round(runif(6,88,110),0),
Day_3=round(runif(6,90,211),0))
我需要创建一个新列,根据column 3, 4 or 5
(ssmin)中的值从column 2
中选择值。
输出将是这样的:
FDRT<-c(89,NA,175,NA,NA,7)
我正在尝试以下命令,但这没有帮助
y$new<- y[which(y$atp==1),na.omit(2+y$ssmin)]
任何人都可以帮我编写代码,因为我的数据是大块的,我不能单独写值。
答案 0 :(得分:2)
我认为这可能是你想要做的,但我不确定:
set.seed(1)
y<-data.frame(atp=c(1,0,1,0,0,1),
ssmin=c(2,NA,3,NA,NA,1),
Day_1=round(runif(6,5,11),0),
Day_2=round(runif(6,88,110),0),
Day_3=round(runif(6,90,211),0))
y
# atp ssmin Day_1 Day_2 Day_3
# 1 1 2 7 109 173
# 2 0 NA 7 103 136
# 3 1 3 8 102 183
# 4 0 NA 10 89 150
# 5 0 NA 6 93 177
# 6 1 1 10 92 210
x <- vapply(y$ssmin, function(x) unique(grep(x, names(y), value = TRUE)),
vector("character", 1L))
Z <- vector(length = length(x))
for (i in sequence(nrow(y))) {
Z[i] <- if (is.na(x[i])) NA else y[i, x[i]]
}
Z
# [1] 109 NA 183 NA NA 10
答案 1 :(得分:1)
如果我理解你的问题,你给出的最后一行几乎可以解决你的问题。您只需稍微修改它以获得右侧的对角元素,并仅将其分配给向量new
的适用元素。这是修改后的代码。
y[which(y$atp==1), "new"] <- diag(as.matrix(y[which(y$atp==1),na.omit(2+y$ssmin)]))
答案 2 :(得分:1)
不是很优雅但很短
ý
atp ssmin Day_1 Day_2 Day_3
1 1 2 5 97 123
2 0 NA 8 108 165
3 1 3 10 109 190
4 0 NA 9 110 177
5 0 NA 10 91 182
6 1 1 7 94 141
> apply(y,1, function(r)r[r[2]+2])
[1] 97 NA 190 NA NA 7
对于更强大的可维护解决方案,您可能希望使用ddply或某些东西对列名进行硬编码。