寻找一种直观的方法来比较R中字符串的因子

Nic*_*eng 1 r

字符串值按R中的字母顺序排序,因此默认情况下,字符串small似乎"大于"字符串,moderate并且huge:

a <- c("small", "moderate", "huge")
sort(a, decreasing = F)            
#> [1] "huge"     "moderate" "small"
a > "small"                        
#> [1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

更改R中字符串顺序的最合理方法是将它们存储为因子并指定级别:

b <- factor(c("small", "moderate", "huge"), levels = c("small", "moderate", "huge"))
sort(b, decreasing = F)                                                             
#> [1] small    moderate huge    
#> Levels: small moderate huge
Run Code Online (Sandbox Code Playgroud)

现在,我知道有两种方法可以将因子与字符串进行比较,以获得大于的值small:

b %in% c("moderate", "huge")                                                        
#> [1] FALSE  TRUE  TRUE
as.integer(b) > 1                                                                   
#> [1] FALSE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

然而,当一个因子中存在多个级别时,第一种方式是乏味的,在这种情况下,我将必须列出所有合格的级别.另一方面,第二种方式并不直观.

在PostgreSQL中,您可以定义一个enum类似于factorR 的数据类型,因此当您进行比较时b > 'small',结果将是FALSE TRUE TRUE.但在R中,你不能这样做:

b > "small"                                                                         
#> Warning in Ops.factor(b, "small"): '>' not meaningful for factors
#> [1] NA NA NA
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,R中的上述操作是否可能存在我缺少的一些先决条件; 还是有另一种方便直观的方法来达到目的吗?

Jul*_*ora 5

如果我正确理解了这个问题,那么我认为ordered你想要的是:

x <- ordered(c("small", "moderate", "huge"), levels = c("small", "moderate", "huge"))
x[1] < x[2]
# [1] TRUE
x[1] < x[3]
# [1] TRUE
x[2] < x[3]
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

以来

x
# [1] small    moderate huge    
# Levels: small < moderate < huge
Run Code Online (Sandbox Code Playgroud)

我们也有

x[1] < "huge"
# [1] TRUE
x[1] < "huuge"
# [1] NA
Run Code Online (Sandbox Code Playgroud)

事实上,正如@NickZeng评论的那样,ordered只是一个因素之间的强加顺序(按递增顺序给出),它是factor一个选项的捷径ordered = TRUE.

从有序因子回到无序因子也很容易:factor(x)给出它.