我有数据框:
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. 欢呼声。
答案 0 :(得分:3)
我们可以在使用sub
或substring
删除前缀“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.frame
或read.csv/read.table