关于向量:R中是否有替代 as.numeric(as.character(my.factor)) 的简短替代方法?

 2022-02-13 

Is there a short alternative to as.numeric(as.character(my.factor)) in R?

如果我想在 R 中获取一个因子的数值,我已经厌倦了写 as.numeric(as.character(my.factor))。虽然它有效,但代码的作用并不是不言而喻的,只是感觉转换数字是错误的到字符串并再次返回以对它们进行任何操作。有没有像 factor.values(my.factor) 这样更简单、更不言自明的方式?

建议将其打包到自定义函数中,例如

1
factor.values = function(x) as.numeric(levels(x))[x]  # get the actual values of a factor with numeric labels

这个解决方案的问题是,如果它要被协作者重现,它必须在脚本之间复制粘贴。我在问是否有一个简短的内置方法可以做到这一点。我知道这是一个非常小的问题,但由于它很常见,而且许多人发现通常提出的解决方案违反直觉,所以我还是提出了它。

问题

Fpr the unitiated,如果你有一个因子并且想要对它进行数值运算,你会遇到很多问题:

1
2
3
4
5
6
7
8
9
10
11
12
   > my.factor = factor(c(1, 1, 2, 5, 8, 13, 21))
    > sum(my.factor)  # let's try a numeric operation
    Error in Summary.factor(1:6, na.rm = FALSE) :
      sum not meaningful for factors
    > as.numeric(my.factor)  # oh, let's make it numeric then.
    [1] 1 1 2 3 4 5 6  # argh! levels numbers and not values
    > as.character(my.factor)  # because the web told me so.
    [1]"1" "1" "2" "5" "8" "13""21"  # closer...
    > as.numeric(as.character(my.factor))  # NOT short or self-explanatory!
    [1]  1  1  2  5  8 13 21  # finally we can sum ...
    > sum(as.numeric(as.character(my.factor)))
    [1] 51


来自 ?factor

To transform a factor ‘f’ to approximately its
original numeric values, ‘as.numeric(levels(f))[f]’ is recommended
and slightly more efficient than ‘as.numeric(as.character(f))’.