如何在R中优化这些循环

时间:2014-01-17 01:35:22

标签: r optimization for-loop vectorization

我正在清理数据,最终导致了很多for循环。由于我的数据集超过600万行,这对我来说有点问题,但我不确定如何避免它。

我的数据集(称为sentencing.df)的示例如下:

    Ethnicity     PersonNumber

    Caucasian     1
    Caucasian     1
    Unknown       1
    Indian        2
    Indian        2

我想在同一个人号码内进行比较 - 例如,我想知道每个人号码的种族是否相同(如果存在,则更改错误的条目)。我的代码使用for循环,看起来像这样:

PersonListRace <- unique(sentencing.df[sentencing.df$ethnicity == "UNKNOWN",]$PersonNumber) 
PersonListRace <- as.numeric(as.character(PersonListRace))
 # vector of person numbers for those with ethnicity UNKNOWN

for (i in 1:100) {
  race <- sentencing.df[sentencing.df$PersonNumber == PersonListRace[i],]$ethnicity
    # creates a vector of unique ethnicities for that person
  if (length(unique(race)) != 2) {next}
    # excludes those who only have UNKNOWN or who have UNKNOWN plus multiple ethnicities
  else {
   label <- as.character(unique(race[which(race != "UNKNOWN")]))
   sentencing.df[sentencing.df$PersonNumber == PersonListRace[i],]$ethnicity <- label
  }
}

然后我对所有其他变量都有类似的东西,for循环运行时间太长。我已经查看了网站上的其他一些问题和答案,但我的主要问题是我找不到一种方法来比较不同变量中的同一人数,而不使用for循环。

任何有助于我在实际时间框架内实现目标的事情都将非常感激:)

1 个答案:

答案 0 :(得分:1)

我的问题都没有在评论中得到解决,所以我只是举个例子来充分代表问题的复杂性(尽管我的经验是事情很少那么简单);

dat <- read.table(text="Ethnicity     PersonNumber
     Caucasian     1
     Caucasian     1
     Unknown       1
     Indian        2
     Indian        2", header=TRUE)
 dat$TrueEth <- with( dat, ave(Ethnicity, PersonNumber, 
                               FUN=function(perE){
                                              unique( perE[perE != "Unknown"] ) } ) )

> dat
  Ethnicity PersonNumber   TrueEth
1 Caucasian            1 Caucasian
2 Caucasian            1 Caucasian
3   Unknown            1 Caucasian
4    Indian            2    Indian
5    Indian            2    Indian

未解决的问题是如何处理种族的多个价值,如果答案是多数规则,如果有相同数量的非未知,该怎么办。

相关问题