是否有R函数用于将不等列添加到列表中

时间:2019-05-04 16:05:44

标签: r

我有一个下面的列表(还有子列表)。但是这里的列是不相等的。 “ 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列中有一个引用,从中获取列表的数据对象。请指导

3 个答案:

答案 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)