我见过人们使用几种不同的方式从R中的data.frame
中拉出一根列:
df[,1]
df$colname
和
df[[1]]
我最近倾向于使用后者,但只是认为这些可能会做不同的事情。这些之间有什么区别,为什么一个人比另一个更喜欢?
谢谢!
答案 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")]
。