我的数据集看起来像这样(但更大)
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)
答案 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
,否则是多余的(但我会保留它,只是为了安全起见。)