R:将2D数据帧列表重组为一个数据帧

时间:2017-03-19 05:09:37

标签: r list dataframe

这可能是一个简单的问题,但我的大多数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]]))
}

干杯!

3 个答案:

答案 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。