使用不同数量的元素转换嵌套数据框

时间:2017-12-08 21:14:37

标签: r dataframe tidyr

我有一个数据框,其中包含一列嵌套数据框,其中包含1或2列和n行。它在下面的示例中看起来像 df

'data.frame':   3 obs. of  2 variables:
 $ vector:List of 3
  ..$ : chr "p1"
  ..$ : chr "p2"
  ..$ : chr "p3"
 $ lists :List of 3
  ..$ :'data.frame':    2 obs. of  2 variables:
  .. ..$ n1: Factor w/ 2 levels "a","b": 1 2
  .. ..$ n2: Factor w/ 2 levels "1","2": 1 2
  ..$ :'data.frame':    1 obs. of  1 variable:
  .. ..$ n1: Factor w/ 1 level "d": 1
  ..$ :'data.frame':    1 obs. of  2 variables:
  .. ..$ n1: Factor w/ 1 level "e": 1
  .. ..$ n2: Factor w/ 1 level "3": 1

df 可以像这样重新创建:

v <- c("p1", "p2", "p3")
l <- list(data.frame(n1 = c("a", "b"), n2 = c("1", "2")), data.frame(n1 = "d"), data.frame(n1 = "e", n2 = "3"))
df <- as.data.frame(cbind(v, l))

我希望将其转换为看起来像这样的数据框:

[v] [n1] [n2]

p1  a  1

p1  b  2

p2  d  NA

p3  e  3
  • n1和n2分开列
  • 如果行i中的数据帧有n行,则行i的向量元素应重复n次
  • 如果n1或n2中没有内容,则应该有NA

我尝试过使用tidyr :: unnest但是出现了以下错误

 unnest(df)
Error: All nested columns must have the same number of elements.

有没有人更好地了解如何以所需格式转换数据框?

3 个答案:

答案 0 :(得分:2)

purrr::pmap_df的每一行中使用df,我们将vl合并为一个数据框,然后将所有数据框合并为一个数据帧。

library(tidyverse)

pmap_df(df, function(v,l) {
  data.frame(v,l)
})
   v n1   n2
1 p1  a    1
2 p1  b    2
3 p2  d <NA>
4 p3  e    3

答案 1 :(得分:1)

这将避免行间操作,如果你有很多行,这将很重要。

<status>1<status>
          ^
          |
      Missing /

答案 2 :(得分:0)

使用dplyrtidyr的解决方案。 suppressWarnings不是必需的。因为在创建数据框时,有因子列,suppressWarnings是在组合因子时抑制警告消息。

library(dplyr)
library(tidyr)

df1 <- suppressWarnings(df %>%
  mutate(v = unlist(.$v)) %>%
  unnest())
df1
#    v n1   n2
# 1 p1  a    1
# 2 p1  b    2
# 3 p2  d <NA>
# 4 p3  e    3