2013-02-19 2 views
1

У меня есть два разных кадра данных, давайте назовем их «Месяцы» и «Люди».Объединение отдельных и совокупных данных уровня данных

месяца выглядит следующим образом:

Month Site X 
1  1  4 
2  1  3 
3  1  5 
1  2  10 
2  2  7 
3  2  5 

и людей выглядит следующим образом:

ID Month Site 
1 1  1 
2 1  2 
3 1  1 
4 2  2 
5 2  2 
6 2  2 
7 3  1 
8 3  2 

Я хотел бы объединить их, чтобы по существу каждый раз, когда запись в «People» имеет определенный месяц и комбинацию сайтов, она добавляется к соответствующему агрегированному кадру данных, поэтому я бы получил примерно следующее:

Month Site X People 
1  1  4 2 
2  1  3 0 
3  1  5 1 
1  2  10 1 
2  2  7 3 
3  2  5 1 

Но у меня нет туманной идеи, как это сделать. Какие-либо предложения?

ответ

3

Использование базовых пакетов

> aggregate(ID ~ Month + Site, data=People, FUN = length) 
    Month Site ID 
1  1 1 2 
2  3 1 1 
3  1 2 1 
4  2 2 3 
5  3 2 1 
> res <- merge(Months, aggdata, all.x = TRUE) 

> res 
    Month Site X ID 
1  1 1 4 2 
2  1 2 10 1 
3  2 1 3 NA 
4  2 2 7 3 
5  3 1 5 1 
6  3 2 5 1 
> res[is.na(res)] <- 0 
> res 
    Month Site X ID 
1  1 1 4 2 
2  1 2 10 1 
3  2 1 3 0 
4  2 2 7 3 
5  3 1 5 1 
6  3 2 5 1 
2

Если предположить, что data.frame s являются months и people, вот data.table решение:

require(data.table) 
m.dt <- data.table(months, key=c("Month", "Site")) 
p.dt <- data.table(people, key=c("Month", "Site")) 
# one-liner 
dt.f <- p.dt[m.dt, list(X=X[1], People=sum(!is.na(ID)))] 

> dt.f 

# Month Site X People 
# 1:  1 1 4  2 
# 2:  1 2 10  1 
# 3:  2 1 3  0 
# 4:  2 2 7  3 
# 5:  3 1 5  1 
# 6:  3 2 5  1 
Смежные вопросы