我对R如何处理列表和数据框感到困惑。例如:
agg = function() {
df1 = data.frame(a=1:5,b=1:5)
df2 = data.frame(a=11:15,b=11:15)
return(list(df1, df2))
}
res = agg()
# returns NULL
res[1]$a
# returns 1:5
res[[1]]$a
我不明白为什么res的第一个元素不是数据框;相反,我需要双引用来获取元素。我在他的Advanced R网站上阅读了Hadley Wickham的优秀数据结构章节,但仍然无法弄清楚这个例子是什么。任何人都可以解释我错过的东西吗?
答案 0 :(得分:2)
单方括号[]
用于索引R中的向量。双方括号[[]]
用于索引列表。您有一个列表,因此[]
不起作用:
is.list(res)
# [1] TRUE
str(res)
# List of 2
# $ :'data.frame': 5 obs. of 2 variables:
# ..$ a: int [1:5] 1 2 3 4 5
# ..$ b: int [1:5] 1 2 3 4 5
# $ :'data.frame': 5 obs. of 2 variables:
# ..$ a: int [1:5] 11 12 13 14 15
# ..$ b: int [1:5] 11 12 13 14 15
答案 1 :(得分:1)
列表的第一个元素是列表,因此agg[1]
返回一个列表。
您正在寻找列表的第一个组件,该组件保存在agg[[1]]
中。因此agg[[1]]$a
有效。
,例如,看看以下
res[[1]]$a
res[1][[1]]$a
res[1][1][[1]]$a
res[1][1][1][[1]]$a
它们都返回列表第一个组件的列a
。在这些情况下,它们都是相同的列表,即res
的第一个元素。
希望这是有道理的。