2016-12-19 2 views
0

У меня есть головоломка и я буду очень благодарен за любую помощь. Мне нужно написать фрагмент кода, который требует записи одной строки, чтобы она соответствовала более крупному автоматическому процессу. Я привел некоторые фиктивные данные, чтобы помочь проиллюстрировать.Как суммировать заявления ifelse «на лету» с [R]

У меня есть три утверждения ifelse, которые возвращают 1 или 0. Мне нужно суммировать эти 1 и 0, но из-за других унаследованных ограничений в моих реальных данных я не могу ссылаться на их вывод ', а затем' суммировать их. Мне нужно «суммировать их на лету».

Чтобы быть явным ... Я не могу явно ссылаться на выходные данные 1 и 0 либо «use_sms», «use_data», либо «use_voice», и я не могу просто передать заявку/1/sum в dataframe.

Как-то, что мне нужно, это полностью находится сумма трех IfElse-х, что-то вдоль линий ... в сырой, не язык г ...

sum(
ifelse(sms_rev0 & sms_cnt0 > 0 | sms_rev1 & sms_cnt1 > 0 | sms_rev2 & sms_cnt2 > 0, 1, 0), 
ifelse(data_rev0 & data_cnt0 > 0 | data_rev1 & data_cnt1 > 0 | data_rev2 & data_cnt2 > 0, 1, 0), 
ifelse(voice_rev0 & voice_cnt0 > 0 | voice_rev1 & voice_cnt1 > 0 | voice_rev2 & voice_cnt2 > 0, 1, 0) 
) 

Мои реальные данные представлены мне похож на этот headache_df

headache_df = data.frame(sms_rev0 = sample(1:0, 10, replace = T), 
         sms_cnt0 = sample(1:0, 10, replace = T), 
         sms_rev1 = sample(1:0, 10, replace = T), 
         sms_cnt1 = sample(1:0, 10, replace = T), 
         sms_rev2 = sample(1:0, 10, replace = T), 
         sms_cnt2 = sample(1:0, 10, replace = T), 
         data_rev0 = sample(1:0, 10, replace = T), 
         data_cnt0 = sample(1:0, 10, replace = T), 
         data_rev1 = sample(1:0, 10, replace = T), 
         data_cnt1 = sample(1:0, 10, replace = T), 
         data_rev2 = sample(1:0, 10, replace = T), 
         data_cnt2 = sample(1:0, 10, replace = T), 
         voice_rev0 = sample(1:0, 10, replace = T), 
         voice_cnt0 = sample(1:0, 10, replace = T), 
         voice_rev1 = sample(1:0, 10, replace = T), 
         voice_cnt1 = sample(1:0, 10, replace = T), 
         voice_rev2 = sample(1:0, 10, replace = T), 
         voice_cnt2 = sample(1:0, 10, replace = T)) 

row.names(headache_df) = paste0("row", 1:10) 

И я ищу, чтобы захватить мои результаты в этой головной боли борьбе panado_df

panado_df = data.frame(user = row.names(headache_df)) 
attach(headache_df) 
set.seed(1234) 

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

panado_df$use_sms = ifelse(sms_rev0 & sms_cnt0 > 0 | sms_rev1 & sms_cnt1 > 0 | sms_rev2 & sms_cnt2 > 0, 1, 0) 
panado_df$use_data = ifelse(data_rev0 & data_cnt0 > 0 | data_rev1 & data_cnt1 > 0 | data_rev2 & data_cnt2 > 0, 1, 0) 
panado_df$use_voice = ifelse(voice_rev0 & voice_cnt0 > 0 | voice_rev1 & voice_cnt1 > 0 | voice_rev2 & voice_cnt2 > 0, 1, 0) 
rownames(panado_df) = panado_df$user 
panado_df$user = NULL 

Представляю целевой столбец, чтобы проиллюстрировать, как должны выглядеть мои рассчитанные данные. Какие-нибудь интересные решения для достижения моей цели, пожалуйста?

panado_df$target_column = apply(panado_df, 1, sum) 

ответ

1

Если я вас правильно понял, вы могли бы искать что-то вроде этого

panado_df$sums_3 <- sum(ifelse(sms_rev0 & sms_cnt0 > 0 | sms_rev1 & sms_cnt1 > 0 | sms_rev2 & sms_cnt2 > 0, 1, 0), 
    ifelse(data_rev0 & data_cnt0 > 0 | data_rev1 & data_cnt1 > 0 | data_rev2 & data_cnt2 > 0, 1, 0), 
    ifelse(voice_rev0 & voice_cnt0 > 0 | voice_rev1 & voice_cnt1 > 0 | voice_rev2 & voice_cnt2 > 0, 1, 0)) 

и ваш код может быть более описательный характер (так же, как вы это сделали), используя dplyr нравится следующим

pando_df <- headach_df %>% 
    mutate(use_sms=ifelse(sms_rev0 & sms_cnt0 > 0 | sms_rev1 & sms_cnt1 > 0 | sms_rev2 & sms_cnt2 > 0, 1, 0), 
     use_data = ifelse(data_rev0 & data_cnt0 > 0 | data_rev1 & data_cnt1 > 0 | data_rev2 & data_cnt2 > 0, 1, 0), 
     use_voice = ifelse(voice_rev0 & voice_cnt0 > 0 | voice_rev1 & voice_cnt1 > 0 | voice_rev2 & voice_cnt2 > 0, 1, 0)) %>% 
    rowwise() %>% 
    mutate(target_column=sum(use_sms, use_data, use_voice)) 

, и если вы хотите сразу вернуть вектор target_column, добавив magrittr библиотеки, проверьте следующее

pando_df <- headach_df %>% 
    mutate(use_sms=ifelse(sms_rev0 & sms_cnt0 > 0 | sms_rev1 & sms_cnt1 > 0 | sms_rev2 & sms_cnt2 > 0, 1, 0), 
     use_data = ifelse(data_rev0 & data_cnt0 > 0 | data_rev1 & data_cnt1 > 0 | data_rev2 & data_cnt2 > 0, 1, 0), 
     use_voice = ifelse(voice_rev0 & voice_cnt0 > 0 | voice_rev1 & voice_cnt1 > 0 | voice_rev2 & voice_cnt2 > 0, 1, 0)) %>% 
    rowwise() %>% 
    mutate(target_column=sum(use_sms, use_data, use_voice)) %$% 
    target_column 
+0

Привет @mabdrabo. К сожалению, это возвращает общую сумму для всего объекта target_column. Мне нужна сумма подряд за строкой. – CallumH

+0

Hi @mabdrabo. У меня есть проблема в том, что в моих реальных данных panado_df является частью более крупного процесса, и я не могу принудить его к headache_df. Я пытаюсь использовать ваш предлагаемый код, чтобы напрямую добавить столбец в panado_df. Пока нет успеха, но я собираюсь поиграть с ним. :) – CallumH

+0

@CallumH - если бы вы могли поделиться больше, мы могли бы помочь. Удачи :) – mabdrabo

0
headache_df <-within(headache_df, { 
     use_sms <- as.integer(sms_rev0 & sms_cnt0 | sms_rev1 & sms_cnt1 | sms_rev2 & sms_cnt2) 
     use_data<- as.integer(data_rev0 & data_cnt0 | data_rev1 & data_cnt1 | data_rev2 & data_cnt2) 
     use_voice<- as.integer(voice_rev0 & voice_cnt0 | voice_rev1 & voice_cnt1 | voice_rev2 & voice_cnt2) 
     target <- use_sms + use_data + use_voice 
}) 
Смежные вопросы