我有一个下面的列表(还有子列表)。但是这里的列是不相等的。 “ a”列表具有2列,“ b”列表具有3列。
f <- list(a=list(1,2.5,9.5),b=list("2","-true","3",4))
我需要追加此列表,以保留如下参考。例如,
COl1 COl2 COl3 Col4
a 1 false NA
b 2 true 3
正如您在上面看到的,第1列中有一个引用,从中获取列表的数据对象。请指导
答案 0 :(得分:1)
一种选择是使用names
设置list
元素中的map
并将.id
指定为'COL1'以基于{ “ f”的{1}}。请注意,names
返回map
,而list
返回map_df
1)
tb_df/data.frame
2)如果类型不同,请library(tidyverse)
f %>%
map_df(~ set_names(., paste0("COL", seq_along(.)+1)), .id = 'COL1')
# A tibble: 2 x 4
# COL1 COL2 COL3 COL4
# <chr> <dbl> <chr> <chr>
#1 a 1 false <NA>
#2 b 2 true 3
(来自retype
)然后执行
hablar
3)或使用library(hablar)
f1 %>%
map_df(~ set_names(.x, paste0("COL", seq_along(.)+1)) %>%
map(retype), .id = 'COL1')
# A tibble: 2 x 4
# COL1 COL2 COL3 COL4
# <chr> <int> <chr> <int>
#1 a 1 false NA
#2 b 2 true 3
type.convert
4)如果f1 %>%
map_df(~ map(.x, type.convert, as.is = TRUE) %>%
set_names(paste0("COL", seq_along(.x))), .id = "COL1")
# A tibble: 2 x 4
# COL1 COL1 COL2 COL3
# <chr> <int> <chr> <int>
#1 a 1 false NA
#2 b 2 true 3
出现问题,则将其转换为通用类型,即。到integer/numeric
numeric
5):由于类型混合,转换为单个数据后最好执行f1 %>%
map_df(~ map(.x, type.convert, as.is = TRUE) %>%
map_if(is.integer, as.numeric) %>%
set_names(paste0("COL", seq_along(.x))), .id = "COL1")
retype
f %>%
map_df(~ map(.x, as.character) %>%
set_names(paste0("COL", seq_along(.x) + 1)), .id = "COL1") %>%
retype
答案 1 :(得分:1)
1)data.table 在提供新列表fnam
的列表上设置名称,然后使用data.table中的rbindlist
:
library(data.table)
fnam <- lapply(f, function(x) setNames(x, paste0("COL", seq(2, length = length(x)))))
cbind(COL1 = names(f), rbindlist(fnam , fill = TRUE))
给予:
COL1 COL2 COL3 COL4
1: a 1 false <NA>
2: b 2 true 3
2)base R (替代R)不使用任何程序包。我们从f
创建一个字符向量,然后使用read.table
读取它。
Lines <- paste(names(f), sapply(f, paste, collapse = " "))
nc <- max(lengths(f)) + 1
col.names <- paste0("COL", seq_len(nc))
read.table(text = Lines, header = FALSE, fill = TRUE, col.names = col.names)
给予:
COL1 COL2 COL3 COL4
1 a 1 false NA
2 b 2 true 3
如果数据可以包含空格,请使用一些未出现在数据中的分隔符。
答案 2 :(得分:0)
另一个简单的基础R解决方案呢?
f <- list(a=list(1,2.5,9.5),b=list("2","-true","3",4))
m = matrix(NA,ncol=max(sapply(f,length)),nrow=length(f))
for(i in 1:nrow(m)) {
u = unlist(f[[i]])
m[i,1:length(u)] = u
}
your_data_frame = as.data.frame(m)