根据R中的动态值从数据框中选择列

时间:2014-05-31 00:06:53

标签: r select subset

我一直在反对这个问题,并且确信必须有一种有效的方法在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的简单有效的版本方式,请提前感谢,提前感谢您的时间。

1 个答案:

答案 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

也有效。