R中的列子集和索引修改数据框

时间:2016-04-19 20:41:01

标签: r

对于R,mtcars中的数据集,我试图从第1,2和8列和第9列创建数据框的子集。我想索引第8列和第9列,以便我可以调用一个或者其他在我的函数中,以获得一定的输出。

所以我做了

highestmpg <- function(cyl, type) {

  type <- mtcars[, c(8, 9)]
  df <- mtcars[, c(1, 2, type)]

我在函数

中遇到了错误
  

.subset(x,j)出错:无效的下标类型&#39; list&#39;

我不明白这个错误,有人可以帮我弄清楚如何规避这个错误吗?

我的目的是创建一个数据框,我可以在其中输入第2列(cyl),第8列或第9列(0或1),以获得第1列的值(mpg)

我想按照od,然后按类型对mtcars进行排名,以便最终得到一个有组织的mpg数据框,以便以后找到最高的mpg,具体取决于输入

ranking <- mtcars[order(cyl, type, mpg)]

我提前道歉,我仍然是R的初学者,我可能在所有术语中都不正确,我将不胜感激任何建议!

2 个答案:

答案 0 :(得分:0)

如果我执行您提供的代码,我就不会收到您报告的错误,而是另一个错误。当你输入第二行时,我会假设你错过了一个括号,所以它应该是:

type <- mtcars[, c(8, 9)]
df <- mtcars[, c(1, 2, type)]

错误消息表明您正尝试使用列表进行子集化。这是因为typedata.frame(实际上是R中的列表),因此您将列表项1和2添加到此列表中并获得结果:

> c(1, 2, type)
[[1]]
[1] 1

[[2]]
[1] 2

$vs
 [1] 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1

$am
 [1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1

将其用于子集化没有意义,您可能并不打算这样做。我不太明白你想要做什么,所以这是我现在唯一可以提供的帮助。

答案 1 :(得分:0)

您获得的错误是因为您将data.frame type传递给期望单个类型列表的函数(c)。此

mtcars[, c(1, 2, 8)]

或者

mtcars[, c("mpg", "cyl", "am")]

会奏效。

目前还不清楚你是否需要这里的功能。这应该可以给你你想要的东西(按汽车和汽车的比例排列,或者比较或者是)

mtcars[order(mtcars$cyl, mtcars$vs), ]
mtcars[order(mtcars$cyl, mtcars$am), ]