请考虑以下代码:
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
您使用的条件是FALSE
和TRUE
,这实际上没有意义,因为会发生以下情况:
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/