之前我已经处理过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'
自从我使用它以来已经有一段时间了,所以也许我错过了一些非常明显的东西?
答案 0 :(得分:3)
尝试查看trends
和all.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))
看看是否足够。