0

我见过人们使用几种不同的方式从 R 中的 a 中拉出一列data.frame

df[,1]
df$colname

和:

df[[1]]

我最近倾向于使用后者,但只是认为这些可能会做不同的事情。这些之间有什么区别,为什么一个人更喜欢另一种?

谢谢!

4

2 回答 2

3

"[[" 版本不允许选择超过 1 个元素(尽管单个元素可能是长度大于 1 的原子向量或任意复杂度的列表,而 "[ , j]" 版本将允许多个项目要返回。如果提供长度大于 2 的向量,“[[”形式将尝试从“[[”的递归应用中提取元素,首先是列结果的连续元素,然后是该向量中的项目。( ...因为“元素”可能是多值向量。)这有点像数组提取。

test <- data.frame(a=1:5, b=letters[1:5], c=setNames(1:5, letters[1:5]) )
# also would give same results for data.frame
test[[3]]
#1 2 3 4 5 
test[[c(1,3)]]
#[1] 3
# In this case the same as:
test[3,1]
#[1] 3

“[[” 版本(如帮助页面所述)将从向量中删除名称,但这与这个问题无关,因为 data.frames 无论如何都不允许您保留名称。

最重要的区别在于“[[”和“$”之间,因为“[[”允许您使用计算索引。

另一个主要区别是obj[1]和返回的内容之间的区别obj[[1]]。第一个返回一个列表,第二个返回一个向量(至少当obj是一个列表时)。

于 2013-11-07T17:36:24.093 回答
0

看起来@DWin 和@B.Mr.W 涵盖了使用[and从数据框中提取列的最常见方法[[

作为[or方法的替代[[方法,您还可以使用基本函数 ,subset从数据框中提取列。

例如,将从数据集中subset(mtcars, select=mpg)提取命名的列。或者,如果您想要多列,则可以包含列名向量,例如. 请注意,使用该函数时不需要引用列名。mpgmtcarssubset(mtcars, select=c(mpg, cyl))subset

您也可以通过相同的方式通过索引获取列:subset(mtcars, select=1)选择数据框中的第一列,与subset(mtcars, select=mpg).

虽然这在简单地选择列时可能不会使用,但该subset函数可以导致更容易理解和冗长的代码,并且在提取一些感兴趣的行时很有用,例如subset(mtcars, subset=hp<100, select=c(mpg, cyl)). 您也可以使用 来执行此操作[,但它不那么优雅,例如mtcars[mtcars$hp<100, c("mpg", "cyl")].

于 2013-11-07T17:58:44.163 回答