有人可以向我解释这里发生了什么吗?当一个变量被编码为一个因子并且nchar强制转换为一个字符时,为什么该函数不能有效地计算字符数呢?
> x <- c("73210", "73458", "73215", "72350")
> nchar(x)
[1] 5 5 5 5
>
> x <- factor(x)
> nchar(x)
[1] 1 1 1 1
>
> nchar(as.character(x))
[1] 5 5 5 5
感谢。
答案 0 :(得分:4)
这是因为有一个因素,你的数据用1,2表示。你的意思是计算级别的字符:
> nchar(levels(x)[x])
[1] 5 5 5 5
答案 1 :(得分:2)
请参阅?factor
的警告部分:
The interpretation of a factor depends on both the codes and the
‘"levels"’ attribute. Be careful only to compare factors with the
same set of levels (in the same order). In particular,
‘as.numeric’ applied to a factor is meaningless, and may happen by
implicit coercion. 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))’.
nchar(levels(x))
答案 2 :(得分:2)
我认为其他答案是正确的,问题是nchar
正在检查基础整数代码,而不是标签。但是,我认为最直接解决您的问题的是?nchar
:
as.character的默认方法的内部等价物是 在x上执行(因此没有方法调度)
我不是百分百肯定,但我怀疑这意味着nchar
中发生的强制行为不与直接调用{{1}时发生的行为相同,很可能直接转到整数代码,而不是“巧妙地”查看标签。