我有一个由其他列表和数据框组成的复杂列表.我需要将此列表简化为仅包含数据帧 - 因此应将每个二级列表分成单独的第一级数据帧.
这是可重复的例子:
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
Run Code Online (Sandbox Code Playgroud)
结果我需要得到
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
Run Code Online (Sandbox Code Playgroud)
我尝试了函数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
Run Code Online (Sandbox Code Playgroud)
我能想到的一种方法是检查输入类(在运行时lapply)是否为data.frameor list,以及是否data.frame将其转换为data.frame. 这将导致整个列表成为 data.frames 列表的列表。然后你可以使用unlistwithrecursive=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
Run Code Online (Sandbox Code Playgroud)
当数据与您提到的完全一样时,这当然有效。它们是 data.frames 列表或 data.frames 列表列表。哦,欢迎来到 SO(第一个问题)!:)