【问题标题】:Translating a long Excel formula into Dplyr将长 Excel 公式翻译成 Dplyr
【发布时间】:2020-02-21 01:54:32
【问题描述】:

这可能是一个非常非传统的问题,但我完全被难住了。我刚刚从一位前同事那里接手了一个项目,他一直在用 Excel 进行所有报告。它导致了大量的工作簿损坏以及其他问题。我已经能够将他的几乎所有公式翻译成一些兼容的 dplyr。除了这个问题:

=if (C3="Yes" ,if (B20>0, floor(B20/C4) + if (G3 <= mod(B20,C14), 1, ),),)

有人有什么想法吗?我知道这会涉及到case_when,但在那之后我很难过!

【问题讨论】:

  • 请显示一些最小样本数据和预期输出。
  • 说实话,我不知道
  • 需要更多信息才能提供可靠的答案。例如,这个公式在哪个单元格中?什么是 B20、C3、C14 和 G3?这些常数中的任何一个吗?表中有哪些列?

标签: r dplyr


【解决方案1】:

这是一个示例,为了简单起见,我使用了 Excel 列的名称。

library(dplyr)

df <- data.frame(
  C3 = c("Yes", "Yes", "Yes", "No"), 
  B20= c(10, 5, 0, 1), 
  G3 = c(1, 1, 20, 1),
  C4 = c(2, 5, 1, 1),  
  C14 = c(3, 5, 1, 1)
)

您需要做的是两次拨打if_else()。对于接下来的内容,我 假设默认值为 0(请注意,您可以改用 NA)。 基本上,如果只有第一条语句,你会这样做:

df %>% mutate(EX = ifelse(C3 == "Yes", 1, 0))
   C3 B20 G3 C4 C14 EX
1 Yes  10  1  2   3  1
2 Yes   5  1  5   5  1
3 Yes   0 20  1   1  1
4  No   1  1  1   1  0

但是还有第二部分,你需要再拨打if_else()一次:

df %>% mutate(EX = if_else(
  C3 == "Yes", 
  if_else(B20>0, floor(B20/C4) + (G3<=(B20%%C14)), 0),
  0))
   C3 B20 G3 C4 C14 EX
1 Yes  10  1  2   3  6
2 Yes   5  1  5   5  1
3 Yes   0 20  1   1  0
4  No   1  1  1   1  0

%% 相当于 excel 中的mod

【讨论】:

  • 我可能是错的,但我认为您不需要加载 magrittr 作为 dplyr 导入 magrittr 管道。
  • @rdornas 你是对的!和莫里茨埃弗斯,也同意你的评论,我相应地编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
相关资源
最近更新 更多