ifelse产生意外结果

3

我从ifelse函数中得到了意外的结果:

vector <- factor(c('x', 'x', 'y', 'z'), levels = c('x', 'y', 'z'))
ifelse(class(vector) == "factor", yes = levels(vector), no =
unique(vector)) # Returns character "x" and not the expected c("x", "y",
"z")

# Manual debug
class(vector) == "factor" # TRUE
levels(vector) # [1] "x" "y" "z"

有什么想法吗?

1
你需要使用 if,即 if(is.factor(vector)){levels(vector)}else{unique(vector)} - Sotos
1
?ifelse 我们可以了解到它返回的值是 一个与 test 和数据值具有相同长度和属性(包括维度和“类”)的向量,其值来自于 yes 或 no 的值 - loki
一种过度解决方案:从Perl中借用//并执行类似于levels(x) // unique(x)的操作... 实际上:\%//%`= function(x, y)if(!is.null(x))x else y; levels(x)%//% unique(x)` https://dev59.com/32Ag5IYBdhLWcg3wM4hb - Frank
另一个略微过度的选项,但使用ifelse是:unlist(ifelse(class(vector) == "factor", list((levels(vector))), list(unique(vector))))。您可以更改ifelse以返回一个具有一个元素的列表,然后对其进行unlist操作。 - AntoniosK
1个回答

7
我认为你只需要使用一个if语句,而不是ifelse()。后者的作用是处理向量并返回与输入长度相等的向量。如果你想要根据不同条件返回不同数量的元素,只需使用if即可。
vector <- factor(c('x', 'x', 'y', 'z'), levels = c('x', 'y', 'z'))
xx <- if(class(vector) == "factor") levels(vector) else unique(vector)
xx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接