R:基于分类变量 *of 列表 * 创建虚拟变量

标签 r list dummy-variable tidyverse

这个问题在这里已经有了答案:





Split character column into several binary (0/1) columns

(7 个回答)


2年前关闭。




我有一个包含字符串列表的分类变量的数据框,长度可变(这很重要,否则这个问题将是 thisthis 的重复),例如:

df <- data.frame(x = 1:5)
df$y <- list("A", c("A", "B"), "C", c("B", "D", "C"), "E")
df

  x       y
1 1       A
2 2    A, B
3 3       C
4 4 B, D, C
5 5       E


所需的形式是 df$y 中任何地方看到的每个唯一字符串的虚拟变量。 , IE。:
data.frame(x = 1:5, A = c(1,1,0,0,0), B = c(0,1,0,1,0), C = c(0,0,1,1,0), D = c(0,0,0,1,0), E = c(0,0,0,0,1))

  x A B C D E
1 1 1 0 0 0 0
2 2 1 1 0 0 0
3 3 0 0 1 0 0
4 4 0 1 1 1 0
5 5 0 0 0 0 1


这种天真的方法有效:
> uniqueStrings <- unique(unlist(df$y))
> n <- ncol(df)
> for (i in 1:length(uniqueStrings)) {
+   df[,  n + i] <- sapply(df$y, function(x) ifelse(uniqueStrings[i] %in% x, 1, 0))
+   colnames(df)[n + i] <- uniqueStrings[i]
+ }

然而,大数据帧非常丑陋、懒惰和缓慢。

有什么建议?来自 tidyverse 的花哨的东西?

更新:我在下面得到了 3 种不同的方法。我使用 system.time 测试了它们在我的(Windows 7,32GB RAM)笔记本电脑上的真实数据集,包含 1M 行,每行包含长度为 1 到 4 个字符串(大约 350 个唯一字符串值)的列表,磁盘上总共 200MB。所以预期的结果是一个尺寸为 1M x 350 的数据框。tidyverse (@Sotos) 和 base (@joel.wilson) 方法花了很长时间,我不得不重新启动 R。qdapTools (@akrun) 方法但是效果很好:
> system.time(res1 <- mtabulate(varsLists))
   user  system elapsed 
  47.05   10.27  116.82

所以这是我将标记为接受的方法。

最佳答案

我们可以使用 mtabulate

library(qdapTools)
cbind(df[1], mtabulate(df$y))
#  x A B C D E
#1 1 1 0 0 0 0
#2 2 1 1 0 0 0
#3 3 0 0 1 0 0
#4 4 0 1 1 1 0
#5 5 0 0 0 0 1

关于R:基于分类变量 *of 列表 * 创建虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672579/

相关文章:

python - 如何将嵌套字典转换为列表字符串

r - 将条件应用于 R 中的多列

r - tidyverse r 中的虚拟代码分类/序数变量

从数据中删除所有二进制变量

r - 在R中的Wordcloud中将所有单词大写

r - top_n() 没有选择 n

data.table 中的滚动联接未提供所需的输出

r - 将重复的列集收集到单个列中

java - 我如何使用这个监听器

list - F#:递归函数:将列表分为两个相等的部分