将复杂的列表列表转换为数据帧列表

时间:2013-07-26 07:51:37

标签: r list split

我有一个由其他列表和数据框组成的复杂列表。我需要将此列表简化为仅包含数据框 - 因此应将每个第二级列表分成单独的第一级数据框。

这是可重复的例子:

 dd<-data.frame(x=1:3,y=4:6)
 l1<-list(dd,list(dd,dd))
 #original list
 l1
[[1]]
  x y
1 1 4
2 2 5
3 3 6

[[2]]
[[2]][[1]]
  x y
1 1 4
2 2 5
3 3 6

[[2]][[2]]
  x y
1 1 4
2 2 5
3 3 6

结果我需要

 l2<-list(dd,dd,dd)
 l2
[[1]]
  x y
1 1 4
2 2 5
3 3 6

[[2]]
  x y
1 1 4
2 2 5
3 3 6

[[3]]
  x y
1 1 4
2 2 5
3 3 6

我尝试使用函数unlist()和参数recursive=FALSE,但在这种情况下,第一级数据帧将转换为两个向量。

 unlist(l1,recursive=FALSE)
$x
[1] 1 2 3

$y
[1] 4 5 6

[[3]]
  x y
1 1 4
2 2 5
3 3 6

[[4]]
  x y
1 1 4
2 2 5
3 3 6

1 个答案:

答案 0 :(得分:4)

我能想到的一种方法是检查输入类(在运行lapply时)是data.frame还是list,如果它是data.frame转换它到data.frame列表。这将导致整个列表成为data.frames列表的列表。然后,您可以unlist使用recursive=FALSE,如下所示:

unlist(lapply(l1, function(x) 
      if (class(x) == "data.frame") list(x) else x), recursive=FALSE)
[[1]]
  x y
1 1 4
2 2 5
3 3 6

[[2]]
  x y
1 1 4
2 2 5
3 3 6

[[3]]
  x y
1 1 4
2 2 5
3 3 6

当数据正如您所提到的那样,这当然有效。它们是data.frames列表或data.frames列表列表。哦,欢迎来到SO(第一个问题)! :)