【问题标题】:Convert nested list to data frame while preserving column types将嵌套列表转换为数据框,同时保留列类型
【发布时间】:2016-10-06 19:22:21
【问题描述】:

给定一个列表b01,列表:tp01tp02tp03,其中每个tp 存储特定类型的数据,我如何提取每个tp 的类?

目标是返回保留原始变量类型(例如 int、char)的单个数据帧。我正在考虑提取每个tp 的类并存储它们,然后用这些存储的类覆盖数据框的类。

在下面的示例中,生成的数据框有 3 个变量,它们被视为 Factor。我希望他们被视为intcharint

我尝试了以下没有运气:

str(as.data.frame(lapply(b01,unlist)))
str(sapply(as.data.frame(lapply(b01,unlist)),class))
lapply(b01,unlist)
sapply(str(lapply(b01,unlist)),unlist)

MWE:

set.seed(1)
tp01 <- list(sample(seq(0,100),10))
set.seed(2)
tp02 <- list(sample(seq(0,100),10))
tp03 <- list(letters[c(sample(seq(0,26),10))])
b01 <- list(tp01, tp02, tp03)

df <- as.data.frame(matrix(unlist(lapply(all,unlist)),
    nrow=length(unlist(b01[1]))*length(all)))
> df
   V1 V2 V3
1  26  q 18
2  37  j 70
3  56  t 56
4  89  c 16
5  19  g 91
6  86  y 90
7  97  w 12
8  62  v 78
9  58  r 43
10  5  b 50
11 18 26  q
12 70 37  j
13 56 56  t
14 16 89  c
15 91 19  g
16 90 86  y
17 12 97  w
18 78 62  v
19 43 58  r
20 50  5  b

str(df)
'data.frame':   20 obs. of  3 variables:
 $ V1: Factor w/ 19 levels "12","16","18",..: 5 6 10 16 4 15 19 12 11 8 ...
 $ V2: Factor w/ 20 levels "19","26","37",..: 15 14 17 12 13 20 19 18 16 11 ...
 $ V3: Factor w/ 20 levels "12","16","18",..: 3 7 6 2 10 9 1 8 4 5 ...

【问题讨论】:

  • @RichScriven 也只是data.frame(unlist(b01,recursive=FALSE))
  • @nicola - 是的,就是这个;)
  • 还需要添加stringsAsFactors=FALSE来获取字符而不是因子。
  • 如果您命名原始列表的元素,那么这些元素将作为数据框的列名返回(例如,b01 &lt;- list(tp01=tp01, tp02=tp02, tp03=tp03)b01 &lt;- Hmisc::llist(tp01, tp02, tp03))。
  • 谢谢大家。有没有办法将变量名保留为tp01tp02tp03

标签: r list nested


【解决方案1】:

你可以用 lapply 和 as.data.frame 做到这一点:

names(b01) <- c("tp01","tp02","tp03")  #optional
first.step <- lapply(b01, unlist) 
second.step <- as.data.frame(first.step, stringsAsFactors = F) 

请参阅 unlist() 文档以获取有关该步骤强制的信息。 stringsAsFactors = F 参数将在第二步中保留字符向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    相关资源
    最近更新 更多