仅从匹配字符串的列中提取数据

时间:2015-04-20 21:29:30

标签: r

我的数据集看起来像这样(但更大)

Jul_08 <- c(1,0,2,0,3)
Aug_08 <- c(0,0,1,0,1)
Sep_08 <- c(0,1,0,0,1)
month<-c("Jul_08","Aug_08","Jul_08","Sep_08","Jul_08")
dataset <- data.frame(Jul_08 = Jul_08, Aug_08 = Aug_08, Sep_08=Sep_08,month=month)

对于每一行,我将仅隔离&#34;月&#34;所示的选择月份的值。领域。换句话说,对于给定的行,如果列&#34;月&#34; = Jul_08,然后是一个新的&#34;值&#34;专栏,我想包括与该列相关的数据&#34; Jul_08&#34;从那一行。

实质上,输出会将此值列添加到数据集

value<-c(1,0,2,0,3)

创建此最终数据集

dataset.value<-cbind(dataset,value)

2 个答案:

答案 0 :(得分:3)

您可以使用矩阵索引:

w <- match(month, names(dataset))

dataset$value <- dataset[ cbind(seq_len(nrow(dataset)), w) ]

此处w向量告诉R哪个列取值,而seq_len用于表示使用同一行,因此value列是通过取第1列构建的在第1行,然后是第2列和第2行,第3行的第1列,等等。

答案 1 :(得分:2)

您可以使用lapply

value <- unlist(lapply(1:nrow(dataset),
                function(r){ 
                   dataset[r,as.character(dataset[r,'month'])] 
                }))
> value
[1] 1 0 2 0 3

或者,或者:

value <- diag(as.matrix(dataset[,as.character(dataset$month)]))
> value
[1] 1 0 2 0 3    

然后,您可以像在示例中一样cbind新列。

一些注意事项:

  • 我更喜欢unlist(lapply(...))而不是sapply因为自动在sapply函数中实现的简化有时会让我感到惊讶。但是我很确定这次你可以毫无问题地使用它。
  • 仅当as.character列是一个因素(如示例中)时才需要
  • month,否则是多余的(但我会保留它,只是为了安全起见。)