2014-01-17 2 views
0

Я в процессе очистки данных и закончил с большим количеством петель for. Поскольку у моего набора данных больше 6 миллионов строк, для меня это проблема, но я не уверен, как этого избежать.Как оптимизировать эти петли в R

Пример моего набора данных (так называемый sentencing.df) будет что-то вроде:

Ethnicity  PersonNumber 

    Caucasian  1 
    Caucasian  1 
    Unknown  1 
    Indian  2 
    Indian  2 

Я хочу, чтобы сравнить в пределах одного человека числа - например, я хочу знать, является ли этнических групп для каждого число людей одинаково (а затем изменить неправильные записи, если они существуют). Мой код использует для петель и выглядит примерно так:

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.

Все, что поможет мне достичь своей цели в практической сроки будет очень признателен :)

+0

Если PersonListRace является фактором, то это неверно: 'PersonListRace <- as.numeric (PersonListRace)'. Должно быть 'PersonListRace <- as.numeric (as.character (PersonListRace))'. Остальная часть вашего кода не была описана на естественном языке очень хорошо, и ваша команда R слишком слаба, чтобы я мог понять, для меня в любом случае. Пожалуйста, опишите на английском, что такое желание. Есть почти наверняка более эффективные методы. Например, является большинством голосов арбитром «правильного» и как обращаться с связями. –

+0

Извините, если это трудно понять - я все еще относительно новичок в R и изучаю, когда я иду. Я не знаю, как объяснить, что мне нужно, кроме того, что я сказал. Моя конечная цель - использовать известные этнические группы для человека - например, кавказский для человека номер 1 - заполнить пробелы в своих других записях - так измените «неизвестную» этническую принадлежность для человека 1 и на «кавказскую». Моя проблема в том, что мне нужно сравнить этнические группы для каждого отдельного человека, чтобы сделать это, и не могу понять, как это сделать без цикла. – user3204746

ответ

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 

Нерешенные вопросы, что делать с более чем одно значение для этнической принадлежности, и если ответ большинство правил, что делать, если есть равное количество не-Unknown.

+0

А я понимаю, что ты просил сейчас. У меня есть ответы на оба этих вопроса, которые в настоящее время рассматриваются отдельными для циклов, хотя, возможно, есть лучший способ. У меня на самом деле две переменные, этническая принадлежность1 и этническая принадлежность2. Если одна этническая принадлежность> 80% записей (за исключением неизвестных), которая становится этнической принадлежностью1 и этнической принадлежностью 2, является НС. В противном случае, если есть две этнические группы (исключая неизвестность), которые в индивидуальном порядке составляют> 20% записей для человека (например, 75-25 split), наиболее распространенным становится eth1 и следующий наиболее распространенный eth2. Если ни один критерий не встречается, все становится неизвестным. – user3204746

+0

Хм, хотя я сейчас вижу некоторые проблемы с этим. – user3204746

Смежные вопросы