我有一个函数,该函数首先生成向量列表(通过使用lapply生成),然后将其绑定到列向量。我认为这会产生一个数据框。但是,它会产生一个列表列表。
cbind函数无法正常运行。
这是函数生成内容的一个小例子
col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))
a_df <- cbind(col_test, lst_test)
输入
> a_df[1,]
提供输出
$`col_test`
[1] 1
$lst_test
[1] 1 2 3
我希望数据框为
[,1] [,2] [,3] [,4]
[1,] 1 1 2 3
[2,] 2 2 2 2
[3,] 1 1 1 2
[4,] 1 1 2 2
[5,] 2 1 1 1
如何将其转换成这种形式?
答案 0 :(得分:1)
这应该可以解决问题。请注意,我们正在使用do.call
,以便将lst_test
的各个元素作为参数发送到cbind
,这可以防止cbind
创建列表列表。 t
用于将结果矩阵转置为您首选的方向,最后,再用cbind
的另一个col_test
也会插入该数据。
library(tidyverse)
mat.new <- do.call(cbind, lst_test) %>%
t %>%
cbind(col_test, .) %>%
unname
[,1] [,2] [,3] [,4]
[1,] 1 1 2 3
[2,] 2 2 2 2
[3,] 1 1 1 2
[4,] 1 1 2 2
[5,] 2 1 1 1
答案 1 :(得分:1)
data.frame(col_test,t(as.data.frame(lst_test)))
答案 2 :(得分:1)
do.call(rbind, Map(c, col_test, lst_test))
# [,1] [,2] [,3] [,4]
#[1,] 1 1 2 3
#[2,] 2 2 2 2
#[3,] 1 1 1 2
#[4,] 1 1 2 2
#[5,] 2 1 1 1
答案 3 :(得分:1)
col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))
命名子列表,以便我们可以使用bind_rows
names(lst_test) <- 1:length(lst_test)
lst_test1 <- bind_rows(lst_test)
在这种情况下,bind_rows函数由cols绑定,因此我们需要对其进行透视
lst_test_pivot <- t(lst_test1)
但这为我们提供了一个矩阵,因此我们需要将其转换回数据框
lst_test_pivot_df <- as.data.frame(lst_test_pivot)
现在可以用作
cbind(col_test, lst_test_pivot_df)
现在生产
col_test V1 V2 V3
1 1 1 2 3
2 2 2 2 2
3 1 1 1 2
4 1 1 2 2
5 2 1 1 1