在 R data.table 中创建虚拟变量

Posted

技术标签:

【中文标题】在 R data.table 中创建虚拟变量【英文标题】:Creating dummy variables in R data.table 【发布时间】:2013-09-23 17:38:00 【问题描述】:

我正在使用 R 中的一个非常大的数据集,并且一直在使用数据框进行操作,并决定切换到 data.tables 以帮助加快操作速度。我无法理解 J 操作,特别是我试图生成虚拟变量,但我不知道如何在 data.tables[] 中编写条件操作。

MWE:

test <- data.table("index"=rep(letters[1:10],100),"var1"=rnorm(1000,0,1))

我想做的是将列aj 添加为虚拟变量,这样当index == "a"0 否则时,列a 将具有值1。在 data.frame 环境中,它看起来像:

test$a <- 0

test$a[test$index=='a'] <- 1

【问题讨论】:

这是一个可能有帮助的假人示例:***.com/questions/18871614/… 什么是“极大”? model.matrix(~var1+index-1, test) 是不是太慢了? 对于我的数据集(900 万行),下面 Frank 的解决方案是唯一有效的解决方案。使用model.matrix 我内存不足。 【参考方案1】:

这似乎符合您的要求:

inds <- unique(test$index)
test[, (inds) := lapply(inds, function(x) index == x)]

给了

      index        var1     a     b     c     d     e     f     g     h     i     j
   1:     a  0.25331851  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   2:     b -0.02854676 FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   3:     c -0.04287046 FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   4:     d  1.36860228 FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
   5:     e -0.22577099 FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
  ---                                                                              
 996:     f -1.02040059 FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 997:     g -1.31345092 FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 998:     h -0.49448088 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 999:     i  1.75175715 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
1000:     j  0.05576477 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

这是另一种方式:

dcast(test, index + var1 ~ index, fun = length)
# or, if you want to preserve row order
dcast(test[, r := .I], r + index + var1 ~ index, fun = length)[, r := NULL]

还有一个:

rs = split(seq(nrow(test)), test$index)
test[, names(rs) := FALSE ]
for (n in names(rs)) set(test, i = rs[[n]], j = n, v = TRUE )

【讨论】:

弗兰克,有没有办法让这个灵活,以便您可以跨多个列创建多个虚拟对象?基本上,如果您没有名为 index 的列,但想在 lapply 函数中调用特定的列号,然后在其周围放置一个循环,以便它可以对多个列执行此操作,该怎么办? @simon_icl 是的,循环应该可以工作。如果您不确定如何做,请将其作为问题发布,我可以展示我将如何做(其他人可能有更好/更有效的方法)。我明天去看看。

以上是关于在 R data.table 中创建虚拟变量的主要内容,如果未能解决你的问题,请参考以下文章

通过最大化 R data.table 中增加虚拟变量(列)分组的流行度来创建 CDF

在data.table中创建一个变量,变量保存在其他变量中[重复]

你如何在 R 中创建一个虚拟数据集? [复制]

在 pandas for python 中创建虚拟变量

有没有更好的方法在 R 中创建分位数“虚拟”/因子?

基于原始列的 dtype 是对象,在数据框中创建多个虚拟变量的最佳方法是啥?