1

这是我关于 SO 的第一篇文章,所以如果在其他地方问过这个问题,我深表歉意,但我似乎不知道如何表达我的问题,所以很难看。

我遇到的问题是我正在使用一个包含变量的数据框,该变量是一个称为 PrimaryType 的因子。这个变量有 15 个级别,我想从中创建新的二元变量,以便我可以对各个级别进行统计分析。这是我正在使用的代码:

df <- read.csv('Data/ChiCrime11_13.txt', header=T, sep='\t')

for (i in 1:nrow(df)){
  for (crimes in levels(df$PrimaryType)){
    if (df$PrimaryType == crimes) {
      df[crimes] <- 1
    }
    else{
      df[crimes] <- 0
    }
  }
}

我遇到的问题是我的数据框有超过 900,000 次观察,所以很明显这个过程需要很长时间才能运行(我相信 900,000^15 次迭代)。这让我想到了我的问题:有没有办法让这更有效?

任何想法/建议将不胜感激。谢谢!

4

2 回答 2

3

这样的事情可能会更快

for (crimes in levels(df$PrimaryType)){
    df[,crimes] <- ifelse (df$PrimaryType == crimes, 1, 0)
}

如果您只是用零创建所有变量然后只分配这些变量,那会更快。

df[, levels(df$PrimaryType)] <- 0
for (crimes in levels(df$PrimaryType)){
    df[df$PrimaryType == crimes,crimes] <- 1
}

下次遇到此类问题时,您应该寻找有关 R 中优化和矢量操作的问题。

于 2013-09-18T03:12:32.840 回答
3

一、什么样的统计分析?许多函数(例如lm)直接采用因子,无需创建自己的虚拟变量。

如果您确实需要创建自己的,R有一个功能可以做到这一点,如下所示。我不知道在这么大的数据集上它会有多快,但我会在编写自己的代码之前先尝试一下。

model.matrix(~0+PrimaryType, data=df)

示例用法和输出:

> foo <- data.frame(x=factor(LETTERS[1:5]))
> model.matrix(~0+x, data=foo)
  xA xB xC xD xE
1  1  0  0  0  0
2  0  1  0  0  0
3  0  0  1  0  0
4  0  0  0  1  0
5  0  0  0  0  1
于 2013-09-18T04:05:53.077 回答