簡體   English   中英

如何從R中的特定列中選擇值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM