簡體   English   中英

如何從R中的數據集中創建等距值的向量?

[英]how to create a vector of equally-spaced values from a dataset in R?

我有一組數據,如下所示:

數據集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的倉中,我想對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   

這些不是您要求的實際平均值,但可能對您真正需要的有用。

這是圍繞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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM