【问题标题】:How to seperate a list column to multiple logical columns in R?如何将列表列分隔为 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

标签: r tidyverse


【解决方案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 语句。
  • 感谢您的帮助。它按预期工作。
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2017-07-28
  • 2021-12-10
  • 2021-06-28
  • 2022-01-01
相关资源
最近更新 更多