2016-05-05 12 views
1

Имея вектор кампании:R - Проверьте, если элемент из вектора существует в data.frame, а если нет, добавить фиктивные значения

campaignsTypes <- c("Social Media","Distribution","Nurture","Newsletter","Push") 

и data.frame с информацией о них:

out <- structure(list(Type = c("Distribution", "Newsletter", "Nurture", 
"Social Media"), Pageviews = c(42, 880, 17, 84)), .Names = c("Type", 
"Pageviews"), row.names = c(NA, -4L), class = "data.frame") 

Я хочу проверить, включены ли все элементы из вектора campaignsTypes в data.frame out, а если нет, создайте новую строку с фиктивными значениями для этой отсутствующей кампании. До сих пор я могу проверить, нет ли типа campaigngType. Тем не менее, у меня возникают проблемы в назначении не существующий элемент из вектора в качестве значения для первого столбца вручную вставленной новой строки:

> ifelse(campaignsTypes %in% out$Type == FALSE,rbind(out, c(????,0)),"") 
How to put the value of the missing campaign here?----------⤴ 
+0

Что вы ожидаемый выход? Вам нужны 'campaignTypes $ ind <- if (all (campaignTypes% in% out $ Type)) 1 else 0' – akrun

+0

@akrun, ожидаемый вывод должен быть data.frame как' output <- structure (list (Type = («Распространение», «Информационный бюллетень», «Воспитание», «Социальные медиа», «Push»), Pageviews = c (42, 880, 17, 84,0)), .Names = c («Тип», Pageviews "), row.names = c (NA, -5L), class =" data.frame ")', где output $ Type должен включать все элементы vector 'campaignType'. Если тип был включен в результате того, что оператор campaignTypes% in% out $ Type == FALSE равен true, вывод $ Pageviews для этого наблюдения будет назначен с 0 – agustin

+0

. Я отредактировал вопрос, чтобы удалить первое выражение ifelse , поскольку это создает путаницы :) – agustin

ответ

2

Вы можете создайте новый кадр данных с отсутствующими строками, а затем соедините два кадра данных .

rbind(out, data.frame(Type=setdiff(campaignsTypes, out$Type), 
         Pageviews=0L)) 

Результат:

  Type Pageviews 
1 Distribution  42 
2 Newsletter  880 
3  Nurture  17 
4 Social Media  84 
5   Push   0 
+0

Он отлично работает! – agustin

2

Один из способов сделать это,

output <- rbind(out, campaignsTypes[sapply(campaignsTypes, function(i) !(i %in% out$Type))]) 
output$Pageviews[output$Pageviews == output$Type] <- 0 
output 
#   Type Pageviews 
#1 Distribution  42 
#2 Newsletter  880 
#3  Nurture  17 
#4 Social Media  84 
#5   Push   0 
+1

Это решение работает идеально. Тем не менее, я выбрал решение Ernest A в качестве ответа, только потому, что процесс выполняется всего за один шаг. – agustin

+0

Все в порядке. Это лучший ответ. Я полностью забыл о 'setdiff', поэтому я использовал цикл ... – Sotos