r - 使用列表作为 dplyr::case_when 的结果时丢失名称

标签 r dplyr

请考虑以下代码:

library(dplyr)
x <- case_when(
   FALSE ~ list('a' = 'b'),
   TRUE  ~ list('c' = 'd')
)

x 是

列表 1 $ 不适用:字符“d”

我希望 x 中的元素 d 具有名称“c”而不是 NA。我错过了什么吗?这是一个错误吗?我怎样才能实现我的预期行为?

准确地说,我希望上面的语句具有与

相同的结果
x <- list('c' = 'd')

最佳答案

以下内容无关,请跳至更新

在没有示例数据的情况下,通过简短的代码片段并不清楚您的预期行为是什么。

但是在我看来,您在 case_when 上的语法错误。

该函数的工作原理如下:

case_when( Condition 1 ~ Value to be assigned if true,
           Condition 2 ~ Value to be assigned if true

您使用的条件是FALSETRUE,这实际上没有意义,因为会发生以下情况:

x <- case_when(
   FALSE ~ list('a' = 'b'), # FALSE is logically never True, so the value is never put in
   TRUE  ~ list('c' = 'd') # TRUE is always true, x will always be assigned the list
)

所以首先你必须重写你的条件才能有意义。其次,您将列表分配为返回值,我认为这是不正确的。

我假设你想这样做:

x <- case_when(
   VAR == 'a' ~ 'b', # If the variable to be evaluated has the value 'a' x will be 'b'
   VAR == 'c' ~ 'd') # If the variable to be evaluated has the value 'c' x will be 'd'
)

因此,现在计算现有变量“VAR”并返回由代码确定的 x。请注意,此语句不完整,因为对于两个条件都不满足的每种情况,它自然会返回 NA(因此 VAR 既不是“a”也不是“c”)。

所以通常我们会这样完成:

x <- case_when(
   VAR == 'a' ~ 'b', # If the variable to be evaluated has the value 'a' x will be 'b'
   VAR == 'c' ~ 'd') # If the variable to be evaluated has the value 'c' x will be 'd'
   TRUE ~ 'Rest Value' # Assigns Rest value to x for all case that do not meet case 1 or 2
)

更新

这似乎是一个已知问题,请参见此处:

https://github.com/tidyverse/dplyr/issues/4194

Hadley 给出了以下解决方案作为替代方案:

broken_function <- function(value) {
  if (value) {
    list(a = 1, b = 2)
  } else {
    lst(a = 2, b = 3)
  }
}

关于r - 使用列表作为 dplyr::case_when 的结果时丢失名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57463924/

相关文章:

r - 为什么 grepl 可以工作但 str_detect 不能根据行值进行变异?

r - 使用 dplyr 按组计算行数

r - 如何在R中选择带有星号的变量

r - dplyr 更新 data.frame 中的单元格

r - 平滑曲线上的最大曲线变化率

r - 使用 R 和 httr POST 表单

r - ggplot2:在自由尺度上反转每个方面的离散字符变量的顺序?

r - 如何让 combn 在 dplyr::mutate 中工作?

r - 在R中按组计算每两行值的比例

r - 如何仅在没有 NA 的情况下检查一组变量中是否存在某个值?