如何用[R]动态地总结ifelse语句

时间:2016-12-19 07:28:14

标签: r if-statement dataframe on-the-fly

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

我有三个ifelse语句返回1或0。我需要将这些1和0加起来因为我的实际数据中的其他继承约束我不能引用它们的输出'然后'求和它们。我需要在飞行中总结它们。

要明确......我不能明确地引用'use_sms','use_data'或'use_voice'的输出1和0,我不能只将apply / 1 / sum传递给数据帧。

不知何故,我需要的是三个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)
) 

我的真实数据呈现给我类似于头痛_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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 
})