簡體   English   中英

如何在R中優化這些循環

[英]How to optimise these loops in R

我正在清理數據的過程中,最終遇到了很多for循環。 由於我的數據集有超過600萬行,這對我來說有點問題,但是我不確定如何避免。

我的數據集(稱為sendencing.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循環的情況下,僅在同一個人編號中跨不同的變量進行比較。

在實際的時間內能幫助我達到目標的任何事情,將不勝感激:)

我的任何擔憂都未在評論中得到解決,因此我僅以該示例完全代表問題的復雜性為例(盡管我的經驗是事情很少那么簡單);

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

懸而未決的問題是如何處理不止一個種族的價值觀,如果答案是多數制,那么如果存在相同數量的未知數,該怎么辦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM