我一直在反对这个问题,并且确信必须有一种有效的方法在R中执行此操作,而不涉及编写for循环。任何建议都非常感谢!
我想在数据框中创建一个新列,其中包含数据框中现有列的值,但是动态指定了选择其值的列。一个例子将有助于澄清:
> mydata <- head(mtcars)
> mydata
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
> myquery <- c("cyl","cyl","gear","gear","carb", "carb")
此时,我想知道是否有一个简单的R函数会为myquery
的每一行选择列mydata
的值,换句话说:
f(mydata, myquery)
6 6 4 3 2 1
如果有人知道编写f
的简单有效的版本方式,请提前感谢,提前感谢您的时间。
答案 0 :(得分:0)
您可以使用矩阵索引data.frame
以实现该行为
dd<-head(mtcars)
myquery <- c("cyl","cyl","gear","gear","carb", "carb")
dd[cbind(seq_along(myquery), match(myquery, names(dd)))]
# [1] 6 6 4 3 2 1
矩阵的第一列是行,第二列是列(注意使用此方法时,括号中没有逗号,就像执行普通[,]
子集时一样。这里我转换了myqeury使用match
将值设置为其数字列索引,因此矩阵的两列都是相同的类型(因为它们必须是这样)。如果使用行名来索引行,也可以使用字符矩阵。
dd[cbind(rownames(dd), myquery)]
# [1] 6 6 4 3 2 1
也有效。