如何使用 [R] 即时对 ifelse 语句求和

How to sum ifelse statements on the fly with [R]

我有一个 r 难题,如果有任何帮助,我将不胜感激。我需要编写一段代码,需要编写一行以适应更大的自动化流程。我提供了一些虚拟数据来帮助说明。

我有三个 ifelse 语句 return 1 或 0。我需要对这些 1 和 0 求和,但由于我的真实数据中的其他继承约束,我无法引用它们的输出“然后”对它们求和。我“需要”即时对它们求和。

明确地说……我不能明确引用“use_sms”、“use_data”或“use_voice”的输出 1 和 0,而且我不能只传递一个apply/1/sum 到数据框。

不知何故,我需要的是三个 ifelse 的完整总和,类似于……粗略的非 r 语言……

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)

如果我没理解错的话,你可能正在寻找这样的东西

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))

如果您想直接 return 矢量 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
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 
})