R - 以整齐的方式取消列表的Data_frame列

时间:2017-04-15 23:09:44

标签: r dataframe tidyr tidyverse

我在数据框中有数据,其中一列是列表。这是一个例子:

rand_lets <- function(){
  sample(letters[1:26], runif(sample(1:10, 1), min=5, max=12))
}

example_data <- data.frame(ID = seq(1:5),
                           location = LETTERS[1:5],
                           observations = I(list(rand_lets(),
                                                 rand_lets(),
                                                 rand_lets(),
                                                 rand_lets(),
                                                 rand_lets())))

我正在寻找一种优雅的tidyverse方法来取消列表列,以便列表中的每个元素都分成一个新列。例如,第一行看起来像这样:

ID location observations  observations.1  observations.3  observations.3  observations.4  observations.5  observations.6  observations.7  observations.8  observations.9  
1        A  "y"           "b"             "m"             "u"             "x"             "j"             "t"             "i"             "v"             "w"

当然列表条目的长度可能不同,因此空单元格应为NA。

怎么可以这样做?

1 个答案:

答案 0 :(得分:2)

如果您希望将数据保存在&#34; long&#34;格式,你可以这样做:

example_data %>% unnest(observations) 
   ID location observations
1   1        A            e
2   1        A            x
3   1        A            w
...
44  5        E            u
45  5        E            o
46  5        E            z

将数据传播到&#34;广泛&#34;格式,如您的示例所示,您可以执行以下操作:

library(stringr)

example_data %>% unnest(observations) %>%
  group_by(location) %>%
  mutate(counter=paste0("Obs_", str_pad(1:n(),2,"left","0"))) %>%
  spread(counter, observations)
     ID location Obs_01 Obs_02 Obs_03 Obs_04 Obs_05 Obs_06 Obs_07 Obs_08 Obs_09 Obs_10 Obs_11
* <int>   <fctr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>
1     1        A      e      x      w      c      s      j      k      t      z   <NA>   <NA>
2     2        B      k      u      d      h      z      x   <NA>   <NA>   <NA>   <NA>   <NA>
3     3        C      v      z      m      o      s      f      n      c      r      u      b
4     4        D      z      i      m      s      a      v      n      r      e      t      x
5     5        E      f      b      g      h      a      d      u      o      z   <NA>   <NA>