【问题标题】:How to add dummy variables in R for a large data set [duplicate]如何在 R 中为大型数据集添加虚拟变量
【发布时间】:2017-02-01 04:30:39
【问题描述】:

我有一个包含列名的大型数据集:ID 和属性。可能有几行共享同一个 ID,这意味着一个 ID 具有许多不同的属性(分类变量)。我想为属性添加虚拟变量,最后在每行中获得一个具有不同 ID 的数据框,并使用 1/0 指示它是否具有该属性。原始数据有 200 万行和 10000 个不同的属性。因此,理想情况下,我将通过组合相同的 ID 并添加虚拟变量列(每个属性 1 列)来缩小行大小。

当我使用以下代码时,R 崩溃了:

for(t in unique(df$property)){
df3[paste("property",t,sep="")] <- ifelse(df$property==t,1,0)

}

所以我想知道在 R 中为大型数据集添加虚拟变量列的最有效方法是什么?

【问题讨论】:

  • R中一般不需要构造虚拟变量。因子类更适合分类变量。我严重怀疑R“崩溃”。我怀疑你遇到了某种你没有分享的错误。我怀疑你想使用“[[”而不是“[”。 Downvote 是因为未能提供[MCVE]
  • @42- 我在整个数据的一小部分上测试代码,它可以工作。所以我认为这是大数据的问题。大小约为 100 MB
  • 100MB 并不是特别大(取决于您测量“数据”的方式)。
  • 我同意。但是考虑到我们有数千个虚拟变量,这将是一个巨大的稀疏矩阵,我想这可能是 R 失败的原因。有什么方法可以处理吗?
  • 不要使用假人。使用因素。

标签: r dummy-variable


【解决方案1】:

我们可以使用table

as.data.frame.matrix(table(df1))
#  A B C D
#1 1 1 0 0
#3 0 0 1 0
#4 0 0 0 1
#5 0 0 0 2

或者一个有效的方法是dcast from data.table

library(data.table)
dcast(setDT(df1), a~b, value.var = "a", length)

数据

df1 <- structure(list(a = c(1L, 1L, 3L, 4L, 5L, 5L), b = c("A", "B", 
"C", "D", "D", "D")), .Names = c("a", "b"), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")

【讨论】:

  • 这适用于完整的数据集!谢谢!
  • 嗨,如果我不仅想要二元结果(1 或 0),还想要记录 A 所拥有的列数怎么办?
  • @Sheldon 在输出中,“A”只有一列。不清楚你想要什么
  • 例如,假设我在原始数据框中有三列:ID、属性、值。我有两个身份证。 ID 1 对属性 A 和 B 有一些价值,而 ID 2 对属性 B 和 C 有一些价值。
  • 说我想把data.frame(ID=c(1,1,2,2),att=c('a','b','b','c'),values=c(1,2,3,4))转换成data.frame(ID=c(1,2),a=c(1,'NA'),b=c(2,3),c=c('NA',4))
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 2021-10-24
  • 2019-05-24
  • 2020-08-14
  • 2010-09-15
  • 1970-01-01
  • 2017-12-14
  • 2014-10-14
相关资源
最近更新 更多