如何从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
dataset1aggregate(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)),平均值)
您可以使用标签=
获得更好的标签参考:。。。我更喜欢实际值,但你的建议很酷,谢谢我更喜欢实际值,但你的建议很酷,谢谢