如何将列表列分隔为 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 %>% unnest(categories) %>% pivot_wider(names_from = categories, values_from = categories, values_fn = list(categories = function(x) length(x) > 0), values_fill = TRUE)
@akrun 添加了dput
输出
谢谢。你可以试试代码。 my.data %>% unnest(categories) %>% pivot_wider(names_from = categories, values_from = categories, values_fn = list(categories = function(x) length(x) > 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 中的多个逻辑列?的主要内容,如果未能解决你的问题,请参考以下文章
需要将字符串从一列分隔为多列,以';'分隔bigquery中的分隔符
pandas将dataframe中的内容为列表(list)的数据列裂变拆分为多个新的数据列实战:拆分为多个新的数据列(并指定新数据列的名称)数据列中的列表(不等长)拆分为多个新的数据列产生NaN
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容