我是一个R新手,但这件事真的把我难住了--我真的希望更多有经验的人能帮助我。我正在估计一个简单的加权平均值。在我的例子中,我有县的数字编码(FIPS)、土壤碳值和县内土壤覆盖的区域。一个县有不同类型和不同地区的土壤。这意味着给定的县可能在Y1,Y2,Y3地区有X1,X2,X3土壤类型。我想知道基于给定土壤的类型和覆盖面积的整个县的加权平均土壤碳。当我为较小的数据子集(200行)开发一些代码时,当我与手动估计值进行比较时,返回的值是正确的。当我将代码应用于完整的数据集(111,000+行)时,我收到错误消息:
1:总和(soc[which(soc,1 == FIPSi),8]):整数溢出-使用sum(as.numeric(.))
我在子集中没有收到此错误消息。当我尝试求和(as.numeric(...))时按照建议,我收到了一条不同的错误消息。在子集数据中计算的加权平均值在完整数据集中是不同的--即使对于同一县也是如此。
有趣的是,当我将子集数据保存为不同的文件名,但保持底层数据不变时,我收到了与完整数据集中相同的错误消息。这让我认为这不是代码或as.numeric的问题,而是文件本身的问题。但我使用R只有一年左右,我知道我真的不知道。
提前感谢!这是我第一次发布,所以我不确定如何附加数据,如果需要的话,我很乐意发送。
我的代码:
子集数据:
socT<-read.table("R_SOC8.txt", header=TRUE)
FIPS<-unique(socT[,1])
WA<-c()
for(i in 1:length(FIPS)){
WA[i]<-crossprod((socT[which(socT[,1]==FIPS[i]),3]),
(socT[which(socT[,1]==FIPS[i]),8]))/
(sum(socT[which(socT[,1]==FIPS[i]),8]))
}
test8<-cbind(FIPS, WA)
print(test8)完整数据代码:
soc<-read.table("R_SOC20.txt", header=TRUE)
FIPS<-unique(soc[,1])
WA<-c()
for(i in 1:length(FIPS)){
WA[i]<-crossprod((soc[which(soc[,1]==FIPS[i]),3]),
(soc[which(soc[,1]==FIPS[i]),8]))/
(sum(soc[which(soc[,1]==FIPS[i]),8]))
}
fipsoc20<-cbind(FIPS, WA)
print(fipsoc20)示例输出:
子集:
FIPS WA
[1,] 10001 825.0657
[2,] 10003 1327.9600
[3,] 10005 767.9470
[4,] 10007 731.9469完整数据:
FIPS WA
[1,] 10001 825.0657
[2,] 10003 NA
[3,] 10005 NA
[4,] 10007 731.9469发布于 2014-12-18 10:55:56
看起来您正在使用integer类型,并且应该使用double。您可以很容易地从integer帮助页面中看到这一点:
?integer注意到R的当前实现对整数向量使用32位整数,因此可表示的整数的范围被限制在大约+/-2*10^9: doubles可以精确地容纳更大的整数。
我不能保证这一点,因为你没有张贴你的数据结构。尝试使用typeof()进行确认。
https://stackoverflow.com/questions/27538150
复制相似问题