基于列索引的data.frame数据操作

基于列索引的data.frame数据操作,r,R,我有一个data.frame如下所示 A <- sample(1:10,5) B <- sample(11:20, 5) C <- sample(21:30, 5) index <- sample(1:3,5, replace=TRUE) data <- data.frame(A,B,C,index) > data A B C index 1 9 17 30 3 2 10 15 26 2 3 2 19 23 2 4 3

我有一个
data.frame
如下所示

A <- sample(1:10,5)
B <- sample(11:20, 5)
C <- sample(21:30, 5)
index <- sample(1:3,5, replace=TRUE)
data <- data.frame(A,B,C,index)

> data
   A  B  C index
1  9 17 30     3
2 10 15 26     2
3  2 19 23     2
4  3 13 29     2
5  8 12 25     2

A避免使用循环的一个巧妙技巧是使用矩阵对数据帧进行子集划分。让我们首先生成一个矩阵,它指定要提取的“单元格”:

m<-matrix(ncol=2, data=c(as.numeric(rownames(data)), data$index))
应该产生正确的结果。然后,您可以将其指定给数据框的输出列:

data$output<-data[m]

data$output
data.table
方法(应该更有效)

或者


data$output我将使用:
transform(data,output=data[cbind(1:nrow(data),index)])
@akrun,这将是正确的解决方案。我也试着这么做,但可能是把语法弄乱了(把
索引放在第一位)
data[m]
data$output<-data[m]
library(data.table)
setDT(data)[, output := .SD[, index, with = F], by = index]

#     A  B  C index output
# 1:  9 17 30     3     30
# 2: 10 15 26     2     15
# 3:  2 19 23     2     19
# 4:  3 13 29     2     13
# 5:  8 12 25     2     12
data$output <- t(data[,-4])[data$index+(0:4)*3] #0:4 denotes 1-(1:nrow(data)); 
                       #3 is ncol(data[,-4])
data$output 
#[1] 30 15 19 13 12