我见过人们使用几种不同的方法从R中的data.frame
中提取单个列:
df[,1]
df$colname
以及:
df[[1]]
我最近倾向于使用后者,但我只是认为它们可能在做不同的事情。它们之间有什么区别,为什么其中一个会选择一个而另一个呢?
谢谢!
发布于 2013-11-07 09:36:24
"[[“版本不允许选择多个元素(尽管该单个元素可能是长度大于1的原子向量或任意复杂性的列表),而”,j“版本将允许返回多个项。如果提供长度大于2的向量,"[[“表单将尝试从递归应用"[[”)中提取元素,首先是列结果,然后是该向量中的项。(...since一个“元素”可能是一个多值向量。)这有点像数组提取。
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-07 09:58:44
看起来像@DWin和@B.W先生介绍了使用[
和[[
从数据框架中提取列的最常见的方法。
作为[
或[[
方法的替代,您还可以使用基函数subset
从数据框架中提取列。
例如,subset(mtcars, select=mpg)
将从mtcars
数据集中提取名为mpg
的列。或者,如果需要多个列,则可以包括列名向量(如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")]
。
https://stackoverflow.com/questions/19842555
复制相似问题