我见过人们使用几种不同的方式从 R 中的 a 中拉出一列data.frame
:
df[,1]
df$colname
和:
df[[1]]
我最近倾向于使用后者,但只是认为这些可能会做不同的事情。这些之间有什么区别,为什么一个人更喜欢另一种?
谢谢!
"[[" 版本不允许选择超过 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
是一个列表时)。
看起来@DWin 和@B.Mr.W 涵盖了使用[
and从数据框中提取列的最常见方法[[
。
作为[
or方法的替代[[
方法,您还可以使用基本函数 ,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")]
.