在因子变量上使用nchar函数

时间:2012-02-16 23:39:46

标签: r

有人可以向我解释这里发生了什么吗?当一个变量被编码为一个因子并且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

感谢。

3 个答案:

答案 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}时发生的行为相同,很可能直接转到整数代码,而不是“巧妙地”查看标签。