【发布时间】:2023-03-07 13:02:01
【问题描述】:
我在数据框中有数据,其中一列是列表。这是一个例子:
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。
这是怎么做到的?
【问题讨论】:
-
长格式对于不规则数据几乎肯定更有用,但是如果你真的想直接进入宽格式,你可以在列表列中构造数据:
example_data %>% mutate(observations = map(observations, ~as_data_frame(t(.x)))) %>% unnest() -
太棒了。这是
map()的巧妙使用。我同意长格式更有用,但我想在教程中使用我的数据集,从宽格式到长格式是很好的第一课。
标签: r dataframe tidyr tidyverse