如何将列表列分隔为 R 中的多个逻辑列?

Posted

技术标签:

【中文标题】如何将列表列分隔为 R 中的多个逻辑列?【英文标题】:How to seperate a list column to multiple logical columns in R? 【发布时间】:2022-01-19 19:02:53 【问题描述】:

我有一个如下所示的数据:

dput(head(my.data[c("name", "categories")],1))

structure(list(name = "among us", categories = list(c("OnlinePvPLAN", 
"PvPOnlineCo-opLAN", "Co-opCross-PlatformMultiplayerRemote", 
"Playon", "PhoneRemotePlay", "onTablet]"))), row.names = 1L, class = "data.frame")

正如您所想象的那样,这种结构并不容易处理。我想将categories 列分隔为多个逻辑列,如下所示:

name | OnlinePvPLAN | PvPOnlineCo-opLAN | MMOOnlinePvPOnline
-----|--------------|-------------------|--------------------     .....
among|    TRUE      |        TRUE       |       FALSE
us

由于有很多类别列,我决定编写一个函数来编写函数,该函数需要一个类别列表来分隔。

通过以下代码,我可以找到属于特定类别的列:

filter(my.data, map_lgl(my.data$categories, ~"OnlinePvPLAN" %in% .))

使用它,我编写了以下函数:

compile.category.func <- function(data, category.list)
  lapply(X=category.list, function(category)
    category <- c(category)
    mutate(data, category=ifelse(map_lgl(data$categories, ~category %in% .), TRUE, FALSE))
  )
  data

output <- compile.category.func(my.data, c("OnlinePvPLAN","MMOOnlinePvPOnline"))

但是这个函数不起作用并且不会生成任何新列。

【问题讨论】:

我不确定正确的结构。也许library(dplyr);library(tidyr);df1 %&gt;% unnest(categories) %&gt;% pivot_wider(names_from = categories, values_from = categories, values_fn = list(categories = function(x) length(x) &gt; 0), values_fill = TRUE) @akrun 添加了dput 输出 谢谢。你可以试试代码。 my.data %&gt;% unnest(categories) %&gt;% pivot_wider(names_from = categories, values_from = categories, values_fn = list(categories = function(x) length(x) &gt; 0), values_fill = TRUE),它似乎对我有用 @akrun 试过你的代码。列已生成,但都设置为 TRUE。 您的输入只有一行。假设有多行,如果unnest之后的某些行值不存在,则为FALSE 【参考方案1】:

unnest 成长格式,使用 table 创建频率,使用 mutate 转换为 TRUE/FALSE,然后 as.data.frame.matrix 将其转换为数据框,最后添加 name 列。如果需要 1/0,则省略 mutate 行。

library(dplyr)
library(tidyr)
library(tibble)

DF %>%     
  unnest_longer(categories) %>% 
  table %>% 
  as.data.frame.matrix %>%
  mutate(across(, as.logical)) %>%
  rownames_to_column("name")

给予

      name Co-opCross-PlatformMultiplayerRemote OnlinePvPLAN onTablet]
1 among us                                 TRUE         TRUE      TRUE
  PhoneRemotePlay Playon PvPOnlineCo-opLAN
1            TRUE   TRUE              TRUE

【讨论】:

这很好用。是否可以通过函数动态确定将生成哪些列? 仅让某些列在 unnest_longer 之后使用过滤器语句,或将其连接到包含具有所需名称的列的数据框,或在末尾使用 select 语句。 感谢您的帮助。它按预期工作。

以上是关于如何将列表列分隔为 R 中的多个逻辑列?的主要内容,如果未能解决你的问题,请参考以下文章

如何将矩阵转换为 R 中的列向量列表?

如何将矩阵转换为R中的列向量列表?

需要将字符串从一列分隔为多列,以';'分隔bigquery中的分隔符

如何提取/拆分数据框中的列表列以分隔唯一列?

pandas将dataframe中的内容为列表(list)的数据列裂变拆分为多个新的数据列实战:拆分为多个新的数据列(并指定新数据列的名称)数据列中的列表(不等长)拆分为多个新的数据列产生NaN

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容