如何将不同长度的向量列表的元素放入数据框中,并将向量的元素分隔为不同的列
How to put elements of a list of vectors of different lengths into a data frame, with elements of vectors being separated as different columns
我想将列表中的元素放入数据框中。该列表具有以下形状:
$`1`
SW GHS GS
0.49075730 0.46511628 0.02564103
...
$`95`
GHS SW LLB GS
0.06896552 0.03448276 0.03448276 0.00000000
$`96`
GHS SW TD
0.40736411 0.42843691 0.09003831
如您所见,向量的元素并不总是以相同的顺序排列,它们的数量也是可变的。
我希望将其放入这样的数据框中:
GHS SW TD GS LLB
1 0.46511628 0.49075730 NA 0.02564103 NA
2 0.06896552 0.03448276 NA 0.00000000 0.03448276
3 0.40736411 0.42843691 0.09003831 NA NA
我希望你能帮助我,我已经寻找过类似的问题,但到目前为止只能找到向量中元素的数量和顺序一致的情况......
下面的解决方案 (1) 将每个列表元素转换为数据框,其中 t()
用于将元素名称作为数据框中的列名,以及 (2) 将这些数据框行绑定在一起,其中data.table 的 fill
参数对不一致的向量 lengths/names.
有帮助
mylist <- list(
one = c(SW=0.49, GHS=0.46, GS=0.03),
two = c(GHS=0.07, GW = 0.03, LLW=0.03, GS=0.00),
six = c(GHS=0.41, SW=0.42, TD=0.09)
)
temp <- lapply(mylist, function(x) data.frame(t(x)))
data.table::rbindlist(temp, fill=TRUE)
输出:
SW GHS GS GW LLW TD
1: 0.49 0.46 0.03 NA NA NA
2: NA 0.07 0.00 0.03 0.03 NA
3: 0.42 0.41 NA NA NA 0.09
我们也可以在purrr::reduce
中使用purrr::full_join
# Reproducible sample data
set.seed(2018)
lst <- list(
`1` = setNames(as.data.frame(matrix(runif(3), ncol = 3)), c("SW", "GHS", "GS")),
`95` = setNames(as.data.frame(matrix(runif(4), ncol = 4)), c("GHS", "SW", "LLB", "GS")),
`96` = setNames(as.data.frame(matrix(runif(3), ncol = 3)), c("GHS", "SW", "TD")))
# Merge
library(purrr)
reduce(lst, full_join)
# SW GHS GS LLB TD
#1 0.3361535 0.4637233 0.06058539 NA NA
#2 0.4743142 0.1974336 0.60675886 0.3010486 NA
#3 0.9586547 0.1300121 NA NA 0.5468495
我想将列表中的元素放入数据框中。该列表具有以下形状:
$`1`
SW GHS GS
0.49075730 0.46511628 0.02564103
...
$`95`
GHS SW LLB GS
0.06896552 0.03448276 0.03448276 0.00000000
$`96`
GHS SW TD
0.40736411 0.42843691 0.09003831
如您所见,向量的元素并不总是以相同的顺序排列,它们的数量也是可变的。 我希望将其放入这样的数据框中:
GHS SW TD GS LLB
1 0.46511628 0.49075730 NA 0.02564103 NA
2 0.06896552 0.03448276 NA 0.00000000 0.03448276
3 0.40736411 0.42843691 0.09003831 NA NA
我希望你能帮助我,我已经寻找过类似的问题,但到目前为止只能找到向量中元素的数量和顺序一致的情况......
下面的解决方案 (1) 将每个列表元素转换为数据框,其中 t()
用于将元素名称作为数据框中的列名,以及 (2) 将这些数据框行绑定在一起,其中data.table 的 fill
参数对不一致的向量 lengths/names.
mylist <- list(
one = c(SW=0.49, GHS=0.46, GS=0.03),
two = c(GHS=0.07, GW = 0.03, LLW=0.03, GS=0.00),
six = c(GHS=0.41, SW=0.42, TD=0.09)
)
temp <- lapply(mylist, function(x) data.frame(t(x)))
data.table::rbindlist(temp, fill=TRUE)
输出:
SW GHS GS GW LLW TD
1: 0.49 0.46 0.03 NA NA NA
2: NA 0.07 0.00 0.03 0.03 NA
3: 0.42 0.41 NA NA NA 0.09
我们也可以在purrr::reduce
purrr::full_join
# Reproducible sample data
set.seed(2018)
lst <- list(
`1` = setNames(as.data.frame(matrix(runif(3), ncol = 3)), c("SW", "GHS", "GS")),
`95` = setNames(as.data.frame(matrix(runif(4), ncol = 4)), c("GHS", "SW", "LLB", "GS")),
`96` = setNames(as.data.frame(matrix(runif(3), ncol = 3)), c("GHS", "SW", "TD")))
# Merge
library(purrr)
reduce(lst, full_join)
# SW GHS GS LLB TD
#1 0.3361535 0.4637233 0.06058539 NA NA
#2 0.4743142 0.1974336 0.60675886 0.3010486 NA
#3 0.9586547 0.1300121 NA NA 0.5468495