从data.frames中提取列的不同方法

时间:2013-11-07 17:26:07

标签: r dataframe

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

df[,1]
df$colname

df[[1]]

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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是列表时。)

答案 1 :(得分:0)

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

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

例如,subset(mtcars, select=mpg)将从mpg数据集中提取名为mtcars的列。或者,如果您想要多个列,则可以包含列名称向量,例如subset(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")]