2017-10-12 39 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)]