1

我是一名 R 新手,但这真的让我很难过——我真的希望更多有经验的人能帮助我。我正在估计一个简单的加权平均值。就我而言,我有县数字编码 (FIPS)、土壤碳值以及县内土壤覆盖的面积。不同类型和地区的土壤出现在一个县。这意味着给定县可能在 Y1、Y2、Y3 区域上具有 X1、X2、X3 土壤类型。我想根据给定土壤的类型和覆盖面积来了解一个县的总体加权平均土壤碳。当我为较小的数据子集(200 行)开发一些代码时,当我与手动估计进行比较时,返回了正确的值。当我将代码应用于完整的数据集(111,000+ 行)时,我收到了错误消息:

1:在 sum(soc[which(soc[, 1] == FIPS[i]), 8]) :整数溢出 - 使用 sum(as.numeric(.))

我没有在子集中收到此错误消息。当我按照建议尝试 sum(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
4

1 回答 1

0

看起来您正在使用integer类型并且应该使用double. 您可以从integer帮助页面轻松查看:

?integer 请注意,R 的当前实现使用 32 位整数作为整数向量,因此可表示整数的范围被限制在大约 +/-2*10^9 左右:双精度可以精确地保存更大的整数。

我不能保证这一点,因为您没有发布数据结构。尝试typeof()确认。

于 2014-12-18T02:55:55.993 回答