如何从R中的特定列中选择值

时间:2013-12-05 09:17:44

标签: 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 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)]

任何人都可以帮我编写代码,因为我的数据是大块的,我不能单独写值。

3 个答案:

答案 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或某些东西对列名进行硬编码。