这可能是一个简单的问题,但我的大多数R经验都是使用数据帧和dplyr。我有列表列表,其中内部列表包含一个'信息'数据框和一个'结果' dataframe(见下面的例子)。
# Sample code for my data structure
data <- list(
list(data.frame(subject = "A", year = 2016),
data.frame(results = c(1, 2, 3), time = c(4, 5, 6))
),
list(data.frame(subject = "B", year = 2017),
data.frame(results = c(7, 8, 9), time = c(10, 11, 12))
)
)
虽然这对于分析内部列表中的数据非常有用,但我一直在努力做到交叉列表&#39;分析。我想要做的就是重塑我的数据,如下所示。
# Dataframes in lists in lists (current)
[[1]]
[[1]][[1]]
subject year
1 A 2016
[[1]][[2]]
results time
1 1 4
2 2 5
3 3 6
[[2]]
[[2]][[1]]
subject year
1 B 2017
[[2]][[2]]
# Single dataframe (goal)
subject year results time
1 A 2016 1 4
2 A 2016 2 5
3 A 2016 3 6
4 B 2017 7 10
5 B 2017 8 11
6 B 2017 9 12
我已经在网上搜索过,但大多数解决方案都是一个数据框列表,而不是列表列表。
到目前为止,我的最大努力是使用for循环(见下文),但由于我的实际数据很多更大(行和列),我试图找到更高效的溶液
df = data.frame()
for (i in (1:length(data))) {
df = rbind(df,
cbind(data[[i]][[1]], data[[i]][[2]]))
}
干杯!
答案 0 :(得分:2)
由于您熟悉dplyr
,请尝试以下操作:
bind_rows(lapply(data,function(i)do.call(cbind,i)))
PS。我发现bind_cols
效果不佳。也许这是一个小虫子?
答案 1 :(得分:1)
可能会:
do.call(rbind, lapply(1:length(data),
function(i) do.call(cbind, data[[i]])
)
)
答案 2 :(得分:1)
package:data.table使用rbindlist(...,fill = TRUE)做得很好。只需在完成后转换回data.frame。