【问题标题】:Error as.numeric: weighted average subset works full data set doesn't错误为.numeric:加权平均子集适用于完整数据集
【发布时间】:2014-12-18 02:09:40
【问题描述】:

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

1: 总之(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

【问题讨论】:

    标签: r subset weighted-average


    【解决方案1】:

    您似乎正在使用integer 类型,应该使用double。您可以从integer 帮助页面轻松看到这一点:

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

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

    【讨论】:

    • 当我写 typeof(test8) 时,我得到了“double”,而 typeof(soc20) 也给了我“double”。@Alex.
    • 是正确的,因为它是一个与整数有关的问题。尽管我已经按照他的建议使用了 double,但是当我将区域除以 10,000 以减少长度时,代码可以正常工作。如果我没有读过他写的长度限制为 10^9,我不会尝试除以 10,000。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 2017-06-12
    • 2021-03-31
    • 2016-10-12
    • 1970-01-01
    • 2021-09-22
    • 2020-04-02
    • 2019-09-01
    相关资源
    最近更新 更多