2017-10-12 38 views
2

對不起,我可能使用了錯誤的搜索條件,但找不到解決方案。R:如何用平均值替換表中的行

id <- c(rep(1,6),rep(2,6)) 
par1 <- c(rep("a",9),rep("b",3)) 
par2 <- c(rep("c",3),rep("d",9)) 
val <- rnorm(12) 
data <- data.frame(id,par1,par2,val) 

如何與相同的值替換所有行的「ID」:

考慮到與兩個參與者(ID)的實驗中,每個下的兩個不同參數(PAR1,PAR2)執行任務的6倍,「par1」和「par2」由單行記錄,其中「val」的值是替換行的「val」值的平均值?因此

的結果是這樣的一個表:

id par1 par2 val 
1 a c (mean of row 1-3) 
1 a d (mean of row 4-6) 
2 a d (mean of row 7-9) 
2 b d (mean of row 10-12) 
+4

'數據<的mean - 數據。框架(ID,PAR1,PAR2,纈氨酸);彙總(val〜。,數據,平均值)' –

+1

這正是我需要的!謝謝!如果你知道該怎麼做,R可以非常簡單。你想把它作爲正式答案嗎? –

回答

2

對於dplyr方法:

library(dplyr) 

set.seed(123) # for reproducibility 

id <- c(rep(1, 6), rep(2, 6)) 
par1 <- c(rep("a", 9), rep("b", 3)) 
par2 <- c(rep("c", 3), rep("d", 9)) 
val <- rnorm(12) 
data <- data.frame(id, par1, par2, val) 

# group by all variables except `val` 
data %>% group_by_at(vars(-val)) %>% summarize(val = mean(val)) 

其中給出:

# A tibble: 4 x 4 
# Groups: id, par1 [?] 
    id par1 par2  val 
    <dbl> <fctr> <fctr>  <dbl> 
1  1  a  c 0.2560184 
2  1  a  d 0.6382870 
3  2  a  d -0.4969993 
4  2  b  d 0.3794112 
+0

謝謝,這也適用。但是,還有沒有明確列出所有東西都分組的列的方法?在我的實際數據中,我有大約30個參數。 –

1

這裏是data.table一個選項。轉換 'data.frame' 到 'data.table'(setDT(data)),由 'ID', 'PAR1', 'PAR2' 組合,獲得 'VAL'

library(data.table) 
setDT(data)[, .(val = mean(val)), by = .(id, par1, par2)]