我有列表作为列值。如何将每个列表项放入自己的行中?

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>

【讨论】:

以上是关于我有列表作为列值。如何将每个列表项放入自己的行中?的主要内容,如果未能解决你的问题,请参考以下文章

查找作为列表存在的列元素的数据框索引的最快方法

QTableView 获取具有相似列值/数据的行列表

如何使用 lapply 将列表元素放入不同的数据框中

MySQL,根据列值从不同的行中选择

如何根据作为值列表的列值扩展熊猫数据框[重复]

使用 sqoop 和 hive 将分隔列值获取到不同的行中