如何从R中的数据集创建等距值向量?

如何从R中的数据集创建等距值向量?,r,list,vector,R,List,Vector,我有一组数据如下: z x 19.00 7.36 19.50 7.83 20.00 8.31 20.50 8.53 21.00 8.39 数据集1 z x v y d p 19.88000 8.06411 5.46210 1.26122 1000000

我有一组数据如下:

z            x          
19.00        7.36
19.50        7.83   
20.00        8.31
20.50        8.53
21.00        8.39
数据集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创建等间距的容器的方法

换句话说,我有多个z值的向量,我想创建另一个向量,比如19.0,19.5,20.0,20.5…在0.5的容器中,我想平均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循环来检查每个元素。

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

如果第二个数据集是
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   

m也许你不应该平均这两个值,而应该使用线性模型来做这项工作

如果第二个数据集是
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   

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

由于您有多个输入数据集,我还使用了
模式
选项和+习惯用法,首先将所有输入数据集合并到一个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

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

由于您有多个输入数据集,我还使用了
模式
选项和+习惯用法,首先将所有输入数据集合并到一个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

dataset1
aggregate(c(d1$x,d2$x),list(z=findInterval(c(d1$z,d2$z),seq(19,22,5)),平均值)
aggregate(c(d1$x,d2$x),list(z=cut(c(d1$z,d2$z),breaks=seq(19,22,5)),平均值)
您可以使用
标签=
获得更好的标签参考:<代码>聚合(c(d1$x,d2$x),列表(z=findInterval(c(d1$z,d2$z),seq(19,22,5)),平均值)
聚合(c(d1$x,d2$x),列表(z=cut(c(d1$z,d2$z),breaks=seq(19,22,5)),平均值)
您可以使用
标签=
获得更好的标签参考:。。。我更喜欢实际值,但你的建议很酷,谢谢我更喜欢实际值,但你的建议很酷,谢谢