记录R

时间:2015-10-08 09:13:03

标签: r

所以我有以下数据在输入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

有人可以向我解释为什么我的数据无法记录日志吗?

2 个答案:

答案 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自动将其识别为数字。