为什么R需要数据帧的名称?

时间:2012-02-07 09:44:55

标签: r this

如果您有这样的数据框

mydf <- data.frame(firstcol = c(1,2,1), secondcol = c(3,4,5))

为什么会

mydf[mydf$firstcol,]

工作但是

mydf[firstcol,]

止跌&#39;?吨

2 个答案:

答案 0 :(得分:10)

你可以这样做:

mydf[,"firstcol"]

请记住,该列排在第二位,而不是第一位。

在您的示例中,要查看mydf[mydf$firstcol,]给您的内容,我们将其分解:

> mydf$firstcol
[1] 1 2 1

所以真的mydf[mydf$firstcol,]

相同
> mydf[c(1,2,1),]
    firstcol secondcol
1          1         3
2          2         4
1.1        1         3

所以你要求第1,2和1行。也就是说,你要求你的第一行与mydf的第1行相同,你的第2行与第2行相同mydf和您的第3行与mydf的第1行相同;而且你要求两列。

另一个问题是为什么以下不起作用:

> mydf[,firstcol]
Error in `[.data.frame`(mydf, , firstcol) : object 'firstcol' not found

也就是说,为什么当你要求它时,你必须在列名称周围加上引号,而不是在mydf$firstcol时。答案就是您使用的运算符需要不同类型的参数。您可以查看'$'以查看表单x $ name,因此第二个参数可以是未引用的名称。然后,您可以查找?'[',这实际上会引导您进入同一个帮助页面。在那里你会发现以下内容,它解释了它。请注意,“字符”向量需要引用条目(即在R(以及许多其他语言)中输入字符向量的方式。

i, j, ...: indices specifying elements to extract or replace.  Indices
      are ‘numeric’ or ‘character’ vectors or empty (missing) or
      ‘NULL’.  Numeric values are coerced to integer as by
      ‘as.integer’ (and hence truncated towards zero).  Character
      vectors will be matched to the ‘names’ of the object (or for
      matrices/arrays, the ‘dimnames’): see ‘Character indices’
      below for further details.

答案 1 :(得分:2)

没有什么可以补充徐王的非常明确的解释。您可能还需要注意,data.table包允许您使用mydf[firstcol==1,]mydf[,firstcol]之类的符号,这些符号会更加自然。