2017-08-29 208 views
0

在每組中,我想找到兩個子組的平均值。需要明確的是,數據如下所示:查找每組中的平均值

Group Val1 Val2 Val3 
1  50 0.03 50.1 
1  50.2 0.05 50.1 
2  50.3 0.01 50.1 
1  50 0.03 50.2 
1  50.1 0.04 50.2 
1  50 0.01 50.3 
1  50 0.02 50.3 
2  50.3 0.03 50.3 

在每個組中VAL3,我想計算值2的第1組平均值和val2的第2組的平均在某些情況下,VAL3 ,組2中沒有成員。這是我嘗試的代碼。

fileB.mean.dat <- tapply(combined.sorted.data[combined.sorted.data[,1] == 2,3], combined.sorted.data[combined.sorted.data[,1] == 2,4], mean) 

我不知道如何在上面的代碼來檢查是否有第2組的成員還包括,如果不使平均0瓦爾3.換句話說,應該有一個代表對於Val 3的每個值,第1組和第2組的平均值。

+1

'集合(Val2〜Group + Val3,data = df,mean)'將給出每組的平均值。但是,不會給你'失蹤'的意思(我不完全確定有沒有數據的意思是不存在的好處?) – SymbolixAU

+0

我想繪製數據。因此,我想要在曲線圖中顯示均值(即使數據缺失的均值爲0)。對於缺失的數據,平均值爲零的 – user2657817

+3

仍然相當具有誤導性。 – zacdav

回答

3

您可以使用dcastreshape2SymbolixAU's answer的輸出轉換爲您的喜好。

library(reshape2) 
dcast(data = aggregate(Val2 ~ Group + Val3, data = df, mean), 
     formula = Group~Val3, 
     value.var = "Val2") 
# Group 50.1 50.2 50.3 
#1  1 0.04 0.035 0.015 
#2  2 0.01 NA 0.030 

或者你可以做到這一點的基礎R太多,但會相對更復雜

sapply(split(df[c("Group", "Val2")], df$Val3), 
     function(a) sapply(unique(df$Group), 
      function(x) setNames(mean(a$Val2[a$Group == x]), x))) 
# 50.1 50.2 50.3 
#1 0.04 0.035 0.015 
#2 0.01 NaN 0.030 

DATA

df = structure(list(Group = c(1, 1, 5, 1, 1, 1, 1, 5), Val1 = c(50, 
50.2, 50.3, 50, 50.1, 50, 50, 50.3), Val2 = c(0.03, 0.05, 0.01, 
0.03, 0.04, 0.01, 0.02, 0.03), Val3 = c(50.1, 50.1, 50.1, 50.2, 
50.2, 50.3, 50.3, 50.3)), .Names = c("Group", "Val1", "Val2", 
"Val3"), row.names = c(NA, -8L), class = "data.frame") 
1

我們可以使用tidyverse

library(tidyverse) 
df %>% 
    group_by(Group, Val3) %>% 
    summarise(Val2 = mean(Val2)) %>% 
    spread(Val3, Val2) 
# A tibble: 2 x 4 
# Groups: Group [2] 
# Group `50.1` `50.2` `50.3` 
#* <dbl> <dbl> <dbl> <dbl> 
#1  1 0.04 0.035 0.015 
#2  2 0.01  NA 0.030