所以我有以下数据在输入R时提供此输出。
Value
# [1] 8,540.40 9,573.90 8,856.40 8,841.30 8,761.50 9,811.50 8,667.20 8,799.90
# [9] 8,714.90 9,820.70 8,787.40 8,675.90 8,661.60 9,945.70 9,027.20 9,086.90
# [17] 9,280.70 10,639.10 9,640.20 9,527.40 9,728.20 11,193.20 10,077.50 10,197.00
# [25] 10,281.40 11,871.40 10,870.20 11,035.30 11,174.60 12,671.40 11,453.20 11,361.40
# [33] 11,597.90 13,387.10 12,468.10 12,373.00 12,802.50 14,565.70 13,476.70 13,228.10
# [41] 13,681.00 15,180.40 14,290.10 14,021.40 14,305.80 16,348.60 15,468.10 15,080.50
# [49] 15,067.10 17,000.80 15,828.90 15,072.70 15,204.00 16,726.20 14,975.20 14,859.70
# [57] 15,208.60 17,194.10 15,834.50 15,599.50 15,722.60 17,444.40 16,322.90 16,180.60
# [65] 16,499.40 18,637.30 17,171.40 16,947.60 16,842.20 19,149.80 17,726.10 17,493.90
# [73] 17,600.00 19,906.00 18,321.40 18,160.00 18,319.10 20,850.90 19,253.40 18,908.60
# 80 Levels: 10,077.50 10,197.00 10,281.40 10,639.10 10,870.20 11,035.30 ... 9,945.70
我想记录我的数据,所以我认为我需要的只是使用
log(Value)
但是当我这样做时,我收到以下错误消息?
Error in Math.factor(c(61L, 75L, 70L, 69L, 66L, 78L, 63L, 68L, 65L, 79L, :
‘log’ not meaningful for factors
有人可以向我解释为什么我的数据无法记录日志吗?
答案 0 :(得分:11)
您的数据对象属于factor data type,这意味着"数字"你看到的只是某些类别的标签。
让我们重新创建您的数据:
x <- c("8,540.40", "9,573.90","8,856.40", "8,841.30", "8,761.50", "9,811.50", "8,667.20", "8,799.90")
x <- as.factor(x)
调用x
对象只显示
> x
[1] 8,540.40 9,573.90 8,856.40 8,841.30 8,761.50 9,811.50 8,667.20 8,799.90
Levels: 8,540.40 8,667.20 8,761.50 8,799.90 8,841.30 8,856.40 9,573.90 9,811.50
您还可以检查对象类以确保
> class(x)
[1] "factor"
因此要进行任何数值运算,您必须将对象转换为数值。如果您只是使用as.numeric
函数进行转换,那么您将获得的只是类别编号
> x
[1] 8,540.40 9,573.90 8,856.40 8,841.30 8,761.50 9,811.50 8,667.20 8,799.90
Levels: 8,540.40 8,667.20 8,761.50 8,799.90 8,841.30 8,856.40 9,573.90 9,811.50
> as.numeric(x)
[1] 1 7 6 5 3 8 2 4
这个结果显然是错误的。您需要做的是首先将礼仪转换为类似数字的格式,然后将它们转换为数字数据。您应该首先删除数据中的逗号
> sub(",", "", as.character(x))
[1] "8540.40" "9573.90" "8856.40" "8841.30" "8761.50" "9811.50" "8667.20" "8799.90"
然后将此字符串转换为数值
> as.numeric(sub(",", "", as.character(x)))
[1] 8540.4 9573.9 8856.4 8841.3 8761.5 9811.5 8667.2 8799.9
使用这些值,您可以执行所有类型的数值运算,包括记录日志。函数as.character
已将factor
礼节转换为字符串,然后使用sub
删除逗号,并将其输出转换为numeric
数据类型。
将来您应该考虑将stringsAsFactors
参数设置为FALSE
(请参阅,例如here)。默认情况下,R将非数字读为factors
,这可能会产生误导,因为此类数据可能显示为数字,但没有数字含义。使用stringsAsFactors = FALSE
,在最坏的情况下得到的是字符串而不是因子,因此每次尝试进行任何数值运算时,都会看到错误消息和字符串不太容易将它们与数字混淆。您的数据表示也不明确(它有逗号和点),因此该软件的十进制符号不明确。另请参阅here for similar problem。
答案 1 :(得分:0)
正如Hatshepsut所写,您的数据不是存储为数字,而是因为格式化而存储为因子/文本 - 千位分隔符会阻止R自动将其识别为数字。