字符串值按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中的上述操作是否可能存在我缺少的一些先决条件; 还是有另一种方便直观的方法来达到目的吗?
如果我正确理解了这个问题,那么我认为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)给出它.
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |