我试图实现类似于unlist的功能,但类型不会被强制转换为向量,但会返回包含保留类型的列表.例如:
flatten(list(NA, list("TRUE", list(FALSE), 0L))
Run Code Online (Sandbox Code Playgroud)
应该回来
list(NA, "TRUE", FALSE, 0L)
Run Code Online (Sandbox Code Playgroud)
代替
c(NA, "TRUE", "FALSE", "0")
Run Code Online (Sandbox Code Playgroud)
将由...返回unlist(list(list(NA, list("TRUE", list(FALSE), 0L)).
从上面的例子中可以看出,扁平化应该是递归的.标准R库中是否有一个功能可以实现这一功能,或者至少还有一些其他功能可用于轻松有效地实现这一功能?
更新:我不知道从上面是否清楚,但非名单不应该被夷为平地,即flatten(list(1:3, list(4, 5)))应该返回list(c(1, 2, 3), 4, 5).
我在 R 的列表中有 2 个列表。每个子列表包含不同数量的数据帧。数据如下:
df1 <- data.frame(x = 1:5, y = letters[1:5])
df2 <- data.frame(x = 1:15, y = letters[1:15])
df3 <- data.frame(x = 1:25, y = letters[1:25])
df4 <- data.frame(x = 1:6, y = letters[1:6])
df5 <- data.frame(x = 1:8, y = letters[1:8])
l1 <- list(df1, df2)
l2 <- list(df3, df4, df5)
mylist <- list(l1, l2)
Run Code Online (Sandbox Code Playgroud)
我想计算我的列表中的数据帧总数(答案应该是 5,因为我总共有 5 个数据帧)。
我有一个列表,其中包含一些其他列表,但也包含非列表的其他对象,例如数据框。我想将其展平为单个列表,但通常的建议(请参阅如何展平列表列表?或将列表列表转换为单个列表)将unlist(..., recursive = FALSE)不起作用,因为它data.frame也可以在 上运行。
> d <- list(list(a = 1, b = 2), c = data.frame(1:4))
> d
[[1]]
[[1]]$a
[1] 1
[[1]]$b
[1] 2
$c
X1.4
1 1
2 2
3 3
4 4
> unlist(d, recursive = FALSE)
$a
[1] 1
$b
[1] 2
$c.X1.4
[1] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
预期的结果是$c保留相同的data.frame结构。
到目前为止,我唯一的解决方案是在unlisting 之前向所有非列表对象添加一个额外的列表层,但这是一个非常不优雅的解决方案。
> unlist(lapply(d, function(x) if(!inherits(x, "list")) list(x) else x), recursive = …Run Code Online (Sandbox Code Playgroud)