R的相关性;数字

时间:2014-10-07 02:54:17

标签: r correlation

之前我已经处理过R的相关算法,但我不确定我当前的代码是怎么回事。

我的输入数据是两个.csv文件。第一列只有一列,我强制它作为data.frame。它看起来像这样(我的数据是很长的时间序列,所以我只显示前10个数据点)):

                  trends
         V1    0.2701541
         V2      2.00532
         V3      1.79548
         V4    0.2549123
         V5    0.2124736
         V6    -1.132594
         V7    -0.711875
         V8    -1.577067
         V9   -0.5320426
         V10    1.325005

我的其他文件有几列,如下所示:

       X13_EVI     X14_EVI     X15_EVI     X18_EVI
1    1.0492437  0.54155557 -0.58480284 -3.47111922
2    1.7274555  1.46141010  0.79416226  1.04050086  
3    1.7274555  1.46141010  0.48772557  1.17721662  
4   -0.1941446 -0.14833532 -0.12514781  0.22020630  
5   -0.1941446 -0.14833532 -0.12514781  0.22020630  
6   -0.5332505 -0.60826258 -0.73802119 -0.73680402 
7   -0.4202152 -0.49328077 -0.12514781 -0.32665674 
8   -0.9853917 -1.29815348 -1.04445787 -0.73680402 
9   -0.3071799 -0.03335350  0.18128888 -0.46337250  
10   0.5971025  1.00148284  1.10059895  0.63035358

当我尝试

corr=cor(trends, all.obs)

我收到错误消息

Error in cor(trends, all.obs) : 'x' must be numeric

我以前不记得遇到过这个问题而且无法弄清楚是什么导致了这个问题。在过去,我总是能够计算每个观察到的时间序列(all.obs中的列)和趋势(在这种情况下为1趋势)之间的相关性。我已经检查了

> is.numeric(trends)
[1] FALSE
> is.numeric(all.obs)
[1] FALSE
> is.data.frame(all.obs)
[1] TRUE
> is.data.frame(trends)
[1] TRUE

我也做了

> typeof(all.obs)
[1] "list"
> typeof(trends)
[1] "list"

因为我得到了

> trends=as.numeric(trends)
Error: (list) object cannot be coerced to type 'double'

自从我使用它以来已经有一段时间了,所以也许我错过了一些非常明显的东西?

1 个答案:

答案 0 :(得分:3)

尝试查看trendsall.obs的所有列是否都存储为数字。

要执行此操作,请运行sapply(trends, is.numeric)sapply(all.obs, is.numeric)。如果您在输出中看到任何FALSE,则应在as.numeric()函数的帮助下通过强制转换为数字来修复它。

OR,一种避免此类问题的更好方法是在读取csv文件时指定列的类型。您可以使用colClasses函数中的read.csv参数执行此操作。例如:

trends <- read.csv("PATH_TO_DATA_FOLDER/trends.csv", colClasses = "numeric")
all.obs <- read.csv("PATH_TO_DATA_FOLDER/all_obs.csv", colClasses = rep("numeric", 4))

看看是否足够。