我有一个难题,非常感谢任何帮助。我需要编写一段代码,需要编写一行代码以适应更大的自动化流程。我提供了一些虚拟数据来帮助说明。
我有三个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)
答案 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
})