我在数据框中有数据,其中一列是列表。这是一个例子:
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。
怎么可以这样做?
答案 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>