2014-10-06 3 views
-1

Я кадр данных, называемый «чистый», который выглядит следующим образом:If-Else оператор производит неверный результат в R

structure(list(X = 6:12, CollectorID = c(58302467L, 58302467L, 
57754564L, 58301689L, 58302467L, 58302467L, 57754564L), StartDate = structure(c(7L, 
6L, 5L, 3L, 4L, 2L, 1L), .Label = c("10/5/14 1:49", "10/5/14 2:03", 
"10/5/14 2:06", "10/5/14 2:09", "10/5/14 2:25", "10/5/14 2:48", 
"10/5/14 3:06"), class = "factor")), .Names = c("X", "CollectorID", 
"StartDate"), class = "data.frame", row.names = c(NA, -7L)) 

Я хочу перевести числовые значения в CollectorID в имена в новом поле под названием ' Коллектор'. Код, я использую

if(clean$CollectorID==58302467){ 
    clean$Collector<-"Social Media" 
} else if(clean$CollectorID==57754564){ 
    clean$Collector<-"Email" 
} else { 
    clean$Collector<-"Blog Post" 
} 

производит следующее предупреждающее сообщение:

In if (clean$CollectorID == 58302467) { : 
    the condition has length > 1 and only the first element will be used 

Я не понимаю, предупреждение, и мой код также производит неверный результат; он устанавливает все значения в чистом $ Collector в «Post Blog».

+1

Прочтите 'help (" if ")'. После того, как вы прочтете все это примечание, см. Раздел «См. Также, где он предлагает посмотреть« ifelse ». При этом прямое индексирование будет работать отлично. – Dason

ответ

2

Вы можете использовать ifelse(), если хотите. foo - ваши данные.

foo$Collector <- ifelse(foo$CollectorID == 58302467, "Social Media", 
         ifelse(foo$CollectorID == 57754564, "Email", "Blog Post")) 

# X CollectorID StartDate Collector 
#1 6 58302467 10/5/14 3:06 Social Media 
#2 7 58302467 10/5/14 2:48 Social Media 
#3 8 57754564 10/5/14 2:25  Email 
#4 9 58301689 10/5/14 2:06 Blog Post 
#5 10 58302467 10/5/14 2:09 Social Media 
#6 11 58302467 10/5/14 2:03 Social Media 
#7 12 57754564 10/5/14 1:49  Email 

Учитывая комментарий @ KFB, вы можете сделать что-то подобное. Вы создаете еще один фрейм данных с идентификатором CollectorID и Desired (например, «Social Media»). Затем вы можете использовать merge() или left_join() в dplyr. Вот одна с функцией merge()

CollectorID <- c(58302467,57754564,58301689) 
type <- c("Social Media", "Email", "Blog Post") 
ana <- data.frame(CollectorID, type, stringsAsFactors = FALSE) 

merge(foo, ana, by = "CollectorID", all = TRUE) 

# CollectorID X StartDate   type 
#1 57754564 8 10/5/14 2:25  Email 
#2 57754564 12 10/5/14 1:49  Email 
#3 58301689 9 10/5/14 2:06 Blog Post 
#4 58302467 6 10/5/14 3:06 Social Media 
#5 58302467 7 10/5/14 2:48 Social Media 
#6 58302467 10 10/5/14 2:09 Social Media 
#7 58302467 11 10/5/14 2:03 Social Media 
+0

Спасибо @jazzurro, это отлично работает. Любопытно узнать, будет ли ifelse наилучшим способом справиться с этой проблемой, если бы у меня был гораздо более длинный список значений для декодирования. – user3614783

+1

Если это кадр данных, который у вас есть, и если вы не возражаете переписывать CollectorID, вы можете сделать что-то вроде 'foo [foo == 58302467] <-" Social Media "' – jazzurro

+0

Этот метод здесь может быть неэффективным, если ваши данные например, миллион строк. Вероятно, вам нужно будет использовать различные функции «join» в пакетах, таких как data.table и dplyr. – KFB

0

сопоставляют также может быть использован здесь. Используя пример @ jazzurro:

> ana$type[match(foo$CollectorID, ana$CollectorID)] 
[1] "Social Media" "Social Media" "Email"  "Blog Post" "Social Media" "Social Media" "Email"  
> 
> foo$Collector = ana$type[match(foo$CollectorID, ana$CollectorID)] 
> foo 
    X CollectorID StartDate Collector 
1 6 58302467 10/5/14 3:06 Social Media 
2 7 58302467 10/5/14 2:48 Social Media 
3 8 57754564 10/5/14 2:25  Email 
4 9 58301689 10/5/14 2:06 Blog Post 
5 10 58302467 10/5/14 2:09 Social Media 
6 11 58302467 10/5/14 2:03 Social Media 
7 12 57754564 10/5/14 1:49  Email 
Смежные вопросы