[英]How to pick value from a particular column in R
我的數據采用以下形式:
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 2
(ssmin)中的值從column 3, 4 or 5
列中選擇值。 輸出將是這樣的:
FDRT<-c(89,NA,175,NA,NA,7)
我正在嘗試以下命令,但這沒有幫助
y$new<- y[which(y$atp==1),na.omit(2+y$ssmin)]
任何人都可以幫助我如何編寫代碼,因為我的數據是大塊的,我不能單獨寫值。
我想這可能是你想要做的,但我不確定:
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
如果我理解你的問題,你給出的最后一行幾乎可以解決你的問題。 您只需稍微修改它以獲得右側的對角元素,並僅將其分配給向量new
的適用元素。 這是修改后的代碼。
y[which(y$atp==1), "new"] <- diag(as.matrix(y[which(y$atp==1),na.omit(2+y$ssmin)]))
不是很優雅,但很短
ÿ
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或其他方法對列名進行硬編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.