2016-02-15 73 views
0

所以我是一個R代碼初學者。在我看來,有一種快速和骯髒的方式來計算一列中的一組n行的平均值,但是對於標準偏差(或標準誤差)有沒有類似的東西呢?如果可能的話,我想盡量避免循環,因爲這只是我正在構建的日益笨重(用於初學者)代碼的一小部分。 這裏是數據集I將與工作的一個簡單的例子:R中的每n行標準差

 Canopy Species Date   Pa 
1  Maple BETH 4/26/2014 -0.1162607263 
2  Maple BETH 4/26/2014 -0.2742194706 
3  Maple BETH 4/26/2014 -0.1864006372 
4  Maple BETH 4/26/2014 -0.0739905518 
5  Maple BETH 4/26/2014 -0.0751169983 
6  Maple BETH 4/26/2014 -0.0782771938 
7  Maple BETH 4/26/2014 -0.1671646757 
8  Maple BETH 4/26/2014 -0.2464696338 
9  Maple BETH 4/26/2014 -0.2176720386 
10 Maple BETH 4/26/2014 -0.2283216397 
11 Maple BETH 4/26/2014 -0.1152989165 
12 Maple BETH 4/26/2014 -0.2720884764 
13 Maple BETH 4/26/2014 -0.1849383730 
14 Maple BETH 4/26/2014 -0.0734205199 
15 Maple BETH 4/26/2014 -0.0745294634 
16 Maple BETH 4/26/2014 -0.0776640601 
17 Maple BETH 4/26/2014 -0.1658603785 
18 Maple BETH 4/26/2014 -0.2445047320 
19 Maple BETH 4/26/2014 -0.2159337593 
20 Maple BETH 4/26/2014 -0.2264833266 

和這裏是代碼的示例片我指的是用於裝置。這一個發現平均在帕列每隔10行:

mu<-colMeans(matrix(Table$Pa, nrow=10)) 

預先感謝您的幫助,並請讓我知道,如果有任何我應提供更多的信息。

+0

雖然R會讓你,但是重寫像「mean」這樣的函數是不好的做法。嘗試存儲到平均值或其他內容中。 此外,這不會找到每10行的意思... – hedgedandlevered

+1

你可以提供一個可重複的例子。 – Sotos

+1

爲每10行創建一個組ID,使用你最喜歡的聚合工具 – rawr

回答

0

這裏是一個混合基R/dplyr解決方案:首先我創建了一個名爲fac_to_spli的列,這個列是用來計算標準偏差的因子,然後用dplyr的group_by和mutate進行了計算。

library(dplyr) 
df$fac_to_spli <- sort(rep(seq(from = 1, to = nrow(df), by = 10), nrow(df)/2)) 
df %>% group_by(fac_to_spli) %>% mutate(stand_dev = sd(Pa)) 

Source: local data frame [20 x 6] 
Groups: fac_to_spli [2] 

    Canopy Species  Date   Pa fac_to_spli stand_dev 
    (fctr) (fctr) (fctr)  (dbl)  (dbl)  (dbl) 
1 Maple BETH 4/26/2014 -0.11626073   1 0.07604938 
2 Maple BETH 4/26/2014 -0.27421947   1 0.07604938 
3 Maple BETH 4/26/2014 -0.18640064   1 0.07604938 
4 Maple BETH 4/26/2014 -0.07399055   1 0.07604938 
5 Maple BETH 4/26/2014 -0.07511700   1 0.07604938 
6 Maple BETH 4/26/2014 -0.07827719   1 0.07604938 
7 Maple BETH 4/26/2014 -0.16716468   1 0.07604938 
8 Maple BETH 4/26/2014 -0.24646963   1 0.07604938 
9 Maple BETH 4/26/2014 -0.21767204   1 0.07604938 
10 Maple BETH 4/26/2014 -0.22832164   1 0.07604938 
11 Maple BETH 4/26/2014 -0.11529892   11 0.07544763 
12 Maple BETH 4/26/2014 -0.27208848   11 0.07544763 
13 Maple BETH 4/26/2014 -0.18493837   11 0.07544763 
14 Maple BETH 4/26/2014 -0.07342052   11 0.07544763 
15 Maple BETH 4/26/2014 -0.07452946   11 0.07544763 
16 Maple BETH 4/26/2014 -0.07766406   11 0.07544763 
17 Maple BETH 4/26/2014 -0.16586038   11 0.07544763 
18 Maple BETH 4/26/2014 -0.24450473   11 0.07544763 
19 Maple BETH 4/26/2014 -0.21593376   11 0.07544763 
20 Maple BETH 4/26/2014 -0.22648333   11 0.07544763 
0

什麼@rawr使用dplyr包是說:

df %>% 
mutate(id=round(row_number()/10)) %>% 
group_by(id) %>% 
summarize(mean=mean(Pa),sd=sd(Pa)) 

     id  mean  sd 
    (dbl) (dbl) (dbl) 
1  0 52.00000 67.97058 
2  1 32.22222 18.55921 
3  2 44.54545 36.70521 
4  3 23.33333 25.49510 
5  4 24.54545 18.63525 
6  5 58.88889 78.96905 
7  6 52.72727 89.89893 
8  7 31.11111 26.19372 
9  8 24.54545 18.09068 
10  9 50.00000 64.42049 
+0

謝謝,這看起來很有前途,但不幸的是我由於某種原因無法安裝dplyr ......我錯過了什麼?我嘗試從xip文件和CRAN安裝,但是「package」dplyr「不適用於R版本(我嘗試過一對)」...我告訴過你我是初學者。 – Plantapus

+0

'install.packages(「dplyr」)'應該可以工作。安裝完包後,你需要用'library(「dplyr」)'加載它。如果這不起作用,您應該嘗試更新R. – Rool

1

您也可以與基礎R使用by做到這一點:

> n<-nrow(Table) 
> index<-ceiling((1:n)/10) 
> by(Table$Pa,index,mean) 
index: 1 
[1] -0.1663894 
------------------------------------------------------------ 
index: 2 
[1] -0.1650722 
> by(Table$Pa,index,sd) 
index: 1 
[1] 0.07604938 
------------------------------------------------------------ 
index: 2 
[1] 0.07544763 

編輯:你可以把這些一張表,例如,像這樣:

>cbind(index=unique(index),mean=by(Table$Pa,index,mean),sd=by(Table$Pa,index,sd)) 

    index  mean   sd 
1  1 -0.1663894 0.07604938 
2  2 -0.1650722 0.07544763 
+0

這看起來很酷@mrip,但是如何將這些值寫入新表? – Plantapus

+0

是的。查看編輯。在這種情況下'by'返回的基礎類型只是一個向量。 – mrip

+0

太棒了,@ mrip!最後一件事是......有沒有辦法用原始信息替換索引號?例如,1實際上應該是「Maple」,「BETH」和「4/26/2014」三列(Canopy,Species,Date)? – Plantapus