【发布时间】:2018-03-14 02:45:30
【问题描述】:
有谁知道为什么dplyr::case_when() 会在以下代码中产生错误?
tibble(tmp1 = sample(c(T, F), size = 32, replace = T),
tmp2 = sample(c(T, F), size = 32, replace = T),
tmp3 = sample(c(T, F), size = 32, replace = T)) %>%
mutate(tmp = apply(cbind(tmp1, tmp2, tmp3), 1, function(x) {
case_when(
all(x == F) ~ "N",
any(x == T) ~ "Y"
)
}))
Error in mutate_impl(.data, dots) :
Evaluation error: object 'x' not found.
我在 Ubuntu 16.04 上使用 R 3.4.3 和 dplyr 0.7.4。
错误信息相当混乱,因为下面的代码工作正常,这表明x 没有丢失:
tibble(tmp1 = sample(c(T, F), size = 32, replace = T),
tmp2 = sample(c(T, F), size = 32, replace = T),
tmp3 = sample(c(T, F), size = 32, replace = T)) %>%
mutate(tmp = apply(cbind(tmp1, tmp2, tmp3), 1, function(x) {
if (all(x == F)) {
"N"
} else if(any(x == T)) {
"Y"
}
}))
仅供参考,以下代码也可以正常工作:
cbind(tmp1 = sample(c(T, F), size = 32, replace = T),
tmp2 = sample(c(T, F), size = 32, replace = T),
tmp3 = sample(c(T, F), size = 32, replace = T)) %>%
apply(1, function(x) {
case_when(
all(x == F) ~ "N",
any(x == T) ~ "Y"
)
})
【问题讨论】:
-
@Maurits Evers 和 @www 提供了一些非常好的替代方案。但实际用例比示例更复杂(更多变量、更多规则、处理 NA 值),因此首选更灵活的形式(例如 if-else 或 case_when)。你知道为什么
case_when()(比if-else更方便)代码会产生错误吗? -
@www 没有告诉你为什么
case_when不起作用? (“问题是case_when不执行逐行操作。”)顺便说一句,我没有收到错误,但所有条目都是NA。 -
@MauritsEvers 好吧,如果您将
case_when放入apply,则可以进行逐行操作,请参阅问题中的更新示例。我认为@www 没有提到为什么找不到“对象 x”。我使用的是 Ubuntu 16.04,你使用的是什么系统,@MauritsEvers?它是特定于平台的问题吗? -
@NickZeng 如果 MauritsEvers 或我提供的帖子为您的示例生成了所需的输出,请考虑接受其中一个帖子作为答案。如果您的实际用例比您在此处提供的示例更复杂,请考虑使用可以实际代表您的真实数据的示例提出一个新问题。
-
重申一下:当我运行第一个代码块时,没有错误。但是,所有
tmp条目都是NA。