2012-08-10 5 views
1

У меня следующая проблема: У меня есть следующая таблица:Р: Частота и среднее из переменных

> data 
    StartPoint EndPoint timeDiff 
1   A91 TX043  258 
2   A91 TX048  547 
3   A92 TX088  330 
4   A91 TX088  289 
5   A91 TX043  387 
6   A92 TX088  241 
7   A91 TX088  213 
8   A92 TX043  295 
9   A91 TX088  518 
10  A92 TX088  414 

я должен был бы агрегацию следующего вида:

StartPoint EndPoint count mean(timeDiff) 
    A91   TX088 3 mean of 289,213 and 518 
    A91   TX043 2 mean of 258 and 387 
    A91   TX048 1  547 
    A92   TX088 3 mean of 330, 241 and 414 
    A92   TX043 1  295 

счетчик является число вхождения одной и той же пары StartPoint и EndPoint, а среднее - среднее значение timeDiff записей с одинаковыми парами StartPoint и EndPoint. Результат должен быть отсортирован в StartPoint, Count и EndPoint.

Любая помощь была бы принята с благодарностью.

Спасибо заранее, SUGI

мои данные:

data <- structure(list(StartPoint = c("A91", "A91", "A92", "A91", "A91", "A92", "A91", "A92", "A91", "A92"), EndPoint = c("TX043", "TX048", "TX088", "TX088", "TX043", "TX088", "TX088", "TX043", "TX088", "TX088"), timeDiff = c(258, 547, 330, 289, 387, 241, 213, 295, 518, 414)), .Names = c("StartPoint", "EndPoint", "timeDiff"), row.names = c(NA, 10L), class = "data.frame") 

ответ

4

Вы можете сделать это с помощью базовой функции aggregate:

aggregate(timeDiff~StartPoint+EndPoint,data,function(x) cbind(length(x),mean(x))) 
    StartPoint EndPoint timeDiff.1 timeDiff.2 
1  A91 TX043  2.0000 322.5000 
2  A92 TX043  1.0000 295.0000 
3  A91 TX048  1.0000 547.0000 
4  A91 TX088  3.0000 340.0000 
5  A92 TX088  3.0000 328.3333 

Но ddply в plyr пакете может дать более приятные результаты:

library(plyr) 
ddply(data,c(.(StartPoint),.(EndPoint)),summarise,count=length(timeDiff),mean=mean(timeDiff)) 
    StartPoint EndPoint count  mean 
1  A91 TX043  2 322.5000 
2  A91 TX048  1 547.0000 
3  A91 TX088  3 340.0000 
4  A92 TX043  1 295.0000 
5  A92 TX088  3 328.3333 
+2

В ddply называют это '(StartPoint, EndPoint)' должны также работает (меньше печатать ...) – dickoa

+0

совершенны.! Я думал об обеих функциях, но не мог понять, как объединить столбцы. Теперь, когда я вижу ответ, он имеет смысл :) – sugo

3

Вы можете использовать, например, data.table:

library(data.table) 
data <- data.table(data) 
data[, list(count=length(timeDiff), mean=mean(timeDiff)), by=c("StartPoint", "EndPoint")] 
    StartPoint EndPoint count  mean 
1:  A91 TX043  2 322.5000 
2:  A91 TX048  1 547.0000 
3:  A92 TX088  3 328.3333 
4:  A91 TX088  3 340.0000 
5:  A92 TX043  1 295.0000 

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

  • Нет связанных вопросов^_^