我正在清理数据,最终导致了很多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循环。
任何有助于我在实际时间框架内实现目标的事情都将非常感激:)
答案 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
未解决的问题是如何处理种族的多个价值,如果答案是多数规则,如果有相同数量的非未知,该怎么办。