我正在处理带有标签特征的产品数据集。就是说,它们具有一个属性,该属性包含在逗号分隔的单词列表中。例如,
data.frame(
id = c(11, 12, 13),
tags =c("wood,small,old","big,iron,artistic", "pretty,wood")
)
我想将标签列分为每个标签的不同逻辑列,即
| id | wood | iron | small | big | old | artistic | pretty |
------------------------------------------------------------
| 11 | TRUE| FALSE| TRUE| FALSE| TRUE| FALSE| FALSE|
| 12 | FALSE| TRUE| FALSE| TRUE| FALSE| TRUE| FALSE|
| 13 | TRUE| FALSE| FALSE| FALSE| FALSE| FALSE| TRUE|
我尝试使用包中的separate
函数tidyr
,但是标签是无序的,因此很难为每个标签创建一列。
我找到了一种使用mutate
fromdplyr
包并为每个标签手动创建一列的解决方案,
has_tag <- function(tag, tags) {
strsplit(tags, ",") %>% map_lgl(function(x) tag %in% x)
}
df %>%
mutate(
wood = has_tag("wood", tags),
iron = has_tag("iron", tags),
...
)
但是新的标记可能会在将来出现,我想使其具有可扩展性。
有什么方法可以轻松做到这一点?
您可以这样做:
library(tidyverse)
df %>%
separate_rows(tags) %>%
mutate(val = TRUE) %>%
spread(tags, val, FALSE)
id artistic big iron old pretty small wood
1 11 FALSE FALSE FALSE TRUE FALSE TRUE TRUE
2 12 TRUE TRUE TRUE FALSE FALSE FALSE FALSE
3 13 FALSE FALSE FALSE FALSE TRUE FALSE TRUE
对于基数R,它需要一些步骤:
as.data.frame.matrix(xtabs(f~ind+values,
cbind(stack(setNames(strsplit(as.character(df$tags),","),df$id)),f = 1))>0)
artistic big iron old pretty small wood
11 FALSE FALSE FALSE TRUE FALSE TRUE TRUE
12 TRUE TRUE TRUE FALSE FALSE FALSE FALSE
13 FALSE FALSE FALSE FALSE TRUE FALSE TRUE
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句