2015-07-23 2 views
0

У меня есть следующий образец данных. Первые три столбца идентифицируют определенную группу.Среднее значение в других ячейках для уникальных групп

dat <- read.table(header=TRUE, text=" 
       ID LFrom LTo It1 It2 It3 It4 
        1120 1 2 47 152 259 140 
        2000 1.1 2.1 88 236 251 145 
        2000 1.2 2.1 72 263 331 147 
        1120 1 2 71 207 290 242 
        1120 1 2 47 152 259 140 
        2001 1.2 2.1 72 263 331 147 
        2001 1.1 2 71 207 290 242 
        1120 1 2 47 152 259 140 
        2000 1.1 2.1 88 236 251 145 
        1120 1 2 72 263 331 147 
        2000 1.1 2.1 71 207 290 242 
        ") 

dat 
    ID LFrom LTo It1 It2 It3 It4 
1 1120 1.0 2.0 47 152 259 140 
2 2000 1.1 2.1 88 236 251 145 
3 2000 1.2 2.1 72 263 331 147 
4 1120 1.0 2.0 71 207 290 242 
5 1120 1.0 2.0 47 152 259 140 
6 2001 1.2 2.1 72 263 331 147 
7 2001 1.1 2.0 71 207 290 242 
8 1120 1.0 2.0 47 152 259 140 
9 2000 1.1 2.1 88 236 251 145 
10 1120 1.0 2.0 72 263 331 147 
11 2000 1.1 2.1 71 207 290 242 

С помощью функции duplicated я могу узнать уникальные группы.

dat[!duplicated(dat[,1:3]),] 
    ID LFrom LTo It1 It2 It3 It4 
1 1120 1.0 2.0 47 152 259 140 
2 2000 1.1 2.1 88 236 251 145 
3 2000 1.2 2.1 72 263 331 147 
6 2001 1.2 2.1 72 263 331 147 
7 2001 1.1 2.0 71 207 290 242 

Частота уникальных групп.

aggregate(data = transform(dat[1:3], Freq = seq_len(nrow(dat[1:3]))), Freq ~ ., length) 
    ID LFrom LTo Freq 
1 1120 1.0 2.0 5 
2 2001 1.1 2.0 1 
3 2000 1.1 2.1 3 
4 2000 1.2 2.1 1 
5 2001 1.2 2.1 1 

мне нужны результаты, как следующее (среднее значение из последних четырех столбцов для общих первых 3 столбцов) с помощью plyr или dplyr пакетов. Любая помощь приветствуется.

ID LFrom LTo It1 It2 It3 It4 
1 1120 1.0 2.0 67.5 213.1 285.2 163.5 
2 2000 1.1 2.1 69.9 218.6 288.3 173.7 
3 2000 1.2 2.1 72.0 263.0 331.0 147.0 
4 2001 1.2 2.1 72.0 263.0 331.0 147.0 
5 2001 1.1 2.0 71.0 207.0 290.0 242.0 
+1

'Дат%>% group_by (ID, LFrom, LTo)%>% summaryise_each (funs (mean)) ' –

ответ

2

Использование data.table:

library(data.table) 
setDT(dat)[, lapply(.SD, mean), by=.(ID, LFrom, LTo)] 
1

Не уверен, что если plyr было требование или предположение, но если вы любите базы R:

aggregate(formula = cbind(It1,It2,It3,It4) ~ ID + LFrom + LTo, data = dat, FUN = mean) 
+2

Или просто' aggregate (. ~ ID + LFrom + LTo, dat, mean) ' –

Смежные вопросы