【问题标题】:how to create a vector of equally-spaced values from a dataset in R?如何从 R 中的数据集创建等距值的向量?
【发布时间】:2016-04-11 03:34:54
【问题描述】:

我有一组数据如下:

数据集 1

z            x           v           y       d                p
19.88000     8.06411     5.46210     1.26122 1000000.000      13.484       
20.13000     8.23777     5.71589     1.26241 1000000.000      13.774       
20.38000     8.38748     5.98116     1.26355 1000000.000      14.024      
20.63000     8.54422     6.24602     1.26465 1000000.000      14.286 
20.88000     8.70251     6.51180     1.26571 1000000.000      14.551

数据集2

z            x           v           y       d                p
19.13000     7.27788     4.79292     1.16700 1000000.000      11.639 
19.38000     7.45097     5.05959     1.16845 1000000.000      11.915   
19.63000     7.60064     5.34092     1.16984 1000000.000      12.155 
20.88000     8.33493     7.09921     1.17608 1000000.000      13.329
21.00500     8.39859     7.22789     1.17665 1000000.000      14.151

我从几个 .txt 文件中读取数据并将它们组合起来,得到一个包含 z 值的向量(第一列)和另一个包含 x 值的向量(第二列)。但我有几个。首先,我考虑平均不同的 z 和 x 向量。但不幸的是,z 值的间距不相等(这意味着在一个数据集中,z 向量像 19.88、20.13、20.38 等等。但是在另一个数据集中,z 像 19.54、20.22、20.87 等等......)所以我需要一种为向量 z 创建等距 bin 的方法。

换句话说,我有多个 z 值向量,我想创建另一个向量,它像 19.0、19.5、20.0、20.5 ....在 0.5 的 bin 中,我想平均 z 向量中的值和对相应的 x 向量执行相同的操作。我想要的如下:

z            x          
19.00        7.36
19.50        7.83   
20.00        8.31
20.50        8.53
21.00        8.39

这里,7.36 是 7.27788 和 7.45097 的平均值,因为它们的 z 值介于 19.00 和 19.50 之间。同样,7.83 是 7.60064 和 8.06411 的平均值,因为它们的 z 值介于 19.50 和 20.00 之间等等。

在 R 中有一个聪明的方法来做到这一点吗? 因为我的数据集长度不同,我不想写一个 for 循环来检查每个元素。

【问题讨论】:

标签: r list vector


【解决方案1】:

也许您应该使用线性模型来完成这项工作,而不是平均这两个值。

如果你的第二个数据集是d2,你可以这样做:

m <- lm(x ~ z, data=d2)
z <- seq(from=19,to=21,by=.5)
data.frame(z=z, x=predict(m, data.frame(z=z)))
##      z        x
## 1 19.0 7.216522
## 2 19.5 7.513079
## 3 20.0 7.809636
## 4 20.5 8.106194
## 5 21.0 8.402751   

这些不是您询问的实际平均值,但可能对您真正需要的有用。

【讨论】:

  • 我更喜欢实际值,但你的建议很酷,谢谢
【解决方案2】:

这是围绕floor() 构建的一种方法。它将z 除以间隔大小 0.5,然后调用floor(),然后乘以 0.5 以获得包含每个值的间隔的下限(根据您所需的输出)。然后它聚合转换后的z 列上的所有非z 列以获得均值。

由于您有多个输入数据集,我还使用 ls()pattern 选项、mget()do.call()+rbind() 习惯用法首先将所有输入数据集组合到一个 data.frame .

dataset1 <- data.frame(z=c(19.88000,20.13000,20.38000,20.63000,20.88000),x=c(8.06411,8.23777,8.38748,8.54422,8.70251),v=c(5.46210,5.71589,5.98116,6.24602,6.51180),y=c(1.26122,1.26241,1.26355,1.26465,1.26571),d=c(1000000.000,1000000.000,1000000.000,1000000.000,1000000.000),p=c(13.484,13.774,14.024,14.286,14.551));
dataset2 <- data.frame(z=c(19.13000,19.38000,19.63000,20.88000,21.00500),x=c(7.27788,7.45097,7.60064,8.33493,8.39859),v=c(4.79292,5.05959,5.34092,7.09921,7.22789),y=c(1.16700,1.16845,1.16984,1.17608,1.17665),d=c(1000000.000,1000000.000,1000000.000,1000000.000,1000000.000),p=c(11.639,11.915,12.155,13.329,14.151));
aggregate(.~z,transform(do.call(rbind,mget(ls(pattern='^dataset\\d+$'))),z=floor(z/0.5)*0.5),mean);
##      z        x        v        y     d        p
## 1 19.0 7.364425 4.926255 1.167725 1e+06 11.77700
## 2 19.5 7.832375 5.401510 1.215530 1e+06 12.81950
## 3 20.0 8.312625 5.848525 1.262980 1e+06 13.89900
## 4 20.5 8.527220 6.619010 1.235480 1e+06 14.05533
## 5 21.0 8.398590 7.227890 1.176650 1e+06 14.15100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2014-08-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多