[英]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.