【发布时间】: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