我有列表作为列值。如何将每个列表项放入自己的行中?
Posted
技术标签:
【中文标题】我有列表作为列值。如何将每个列表项放入自己的行中?【英文标题】:I have lists as column-values. How do I get each list item into its own row? 【发布时间】:2022-01-05 22:50:12 【问题描述】:我在 R 中有一个如下所示的数据框:
Column 1 | Column 2 | Column 3 | Column 4 |
---|---|---|---|
c(x,y) | c(a,b) | qwert | character(0) |
我想取消列出数据框,使新的看起来像:
Column 1 | Column 2 | Column 3 | Column 4 |
---|---|---|---|
x | a | qwert | N/A |
y | b | N/A | N/A |
我曾尝试使用separate_rows
,但它返回Error: Incompatible lengths
【问题讨论】:
很难根据这些信息重新创建数据框结构。请粘贴dput(mydata)
的输出,其中mydata
是数据框。
可能是tidyr::unnest(my_data)
。可能需要指定列表列。
@GregorThomas 我试过这个,但它仍然给我不兼容的长度错误
好吧,如果你有一个单行的一列长度为 2,另一列长度为 3(例如),那么结果应该是什么就不是很清楚了。如果您可以共享可重现的数据样本,我们可以看看,dput(your_data[example_rows, ])
之类的内容是共享数据的最佳方式,包括所有类和结构信息。
【参考方案1】:
一个可能的解决方案:
library(tidyverse)
df <- data.frame(stringsAsFactors = FALSE, Column1 = c("c(x,y)"), Column2 = c("c(a,b)"), Column3 = c("qwert"), Column4 = c("character(0)"))
df %>%
mutate(Column4 = na_if(Column4, "character(0)")) %>%
separate_rows(1:2,sep = "\\(|,|\\)") %>%
filter(across(1:2, ~ !.x %in% c("c",""))) %>%
mutate(Column3 = if_else(row_number() == 1, Column3, NA_character_))
#> # A tibble: 2 × 4
#> Column1 Column2 Column3 Column4
#> <chr> <chr> <chr> <chr>
#> 1 x a qwert <NA>
#> 2 y b <NA> <NA>
【讨论】:
以上是关于我有列表作为列值。如何将每个列表项放入自己的行中?的主要内容,如果未能解决你的问题,请参考以下文章