基于行值

时间:2017-02-22 16:30:06

标签: r

我有数据框:

DT=data.frame(Row=c(1,2,3,4,5),Price=c(2.1,2.1,2.2,2.3,2.5),
          '2.0'= c(100,300,700,400,0),
          '2.1'= c(400,200,100,500,0),
          '2.2'= c(600,700,200,100,200),
          '2.3'= c(300,0,300,100,100),
          '2.4'= c(400,0,0,500,600),
          '2.5'= c(0,200,0,800,100))

目标是创建一个新列Quantity,选择列中每行的值等于Price,这样:

DT.Objective=data.frame(Row=c(1,2,3,4,5),Price=c(2.1,2.1,2.2,2.3,2.5),
          '2.0'= c(100,300,700,400,0),
          '2.1'= c(400,200,100,500,0),
          '2.2'= c(600,700,200,100,200),
          '2.3'= c(300,0,300,100,100),
          '2.4'= c(400,0,0,500,600),
          '2.5'= c(0,200,0,800,100),
          Quantity= c(400,200,200,100,100))

数据集非常大,因此效率很重要。我目前正在使用并希望提高效率:

Names <- names(DT)
DT$Quantity<- DT[Names][cbind(seq_len(nrow(DT)), match(DT$Price, Names))]

由于某种原因,示例中的列名称前面带有“X”,而实际数据中没有X. 欢呼声。

1 个答案:

答案 0 :(得分:3)

我们可以在使用subsubstring删除前缀“X”后执行行/列索引,然后按照OP的帖子中显示match

DT$Quantity <- DT[cbind(1:nrow(DT), match(DT$Price, sub("^X", "", names(DT))))]
DT$Quantity
#[1] 400 200 200 100 100

当列名以数字开头时,X作为前缀附加。解决此问题的一种方法是在check.names=FALSE电话中使用data.frameread.csv/read.table