2013-09-14 3 views
49

У меня есть фрейм данных DF.data.frame Группа По столбцу

Say ФР:

A B 
1 1 2 
2 1 3 
3 2 3 
4 3 5 
5 3 6 

Теперь я хочу, чтобы объединить вместе строк в столбце А и иметь сумму столбца B.

Например:

A B 
1 1 5 
2 2 3 
3 3 11 

Я делаю это в настоящее время с использованием SQL-запроса с функцией sqldf. Но почему-то это очень медленно. Есть ли более удобный способ сделать это? Я мог бы сделать это вручную, используя цикл for, но он снова медленный. Мой SQL-запрос: «Выберите A, Count (B) из DF-группы через A».

Обычно, когда я не использую векторизованные операции, и я использую для циклов, производительность очень медленная даже для отдельных процедур.

ответ

81

Это распространенный вопрос. В базовой комплектации вы можете найти номер aggregate. Предполагая, что ваш data.frame называется «mydf», вы можете использовать следующее.

> aggregate(B ~ A, mydf, sum) 
    A B 
1 1 5 
2 2 3 
3 3 11 

Я также рекомендовал бы изучить пакет «data.table».

> library(data.table) 
> DT <- data.table(mydf) 
> DT[, sum(B), by = A] 
    A V1 
1: 1 5 
2: 2 3 
3: 3 11 
+1

+1 но что «если данные большие», то спецификатор совершенно не нужен imo – eddi

+1

@eddi, я бы согласился, если бы мы могли использовать синтаксис data.table, который находится на 'data.frame', но если у меня есть небольшой набор данных уже загружен, и я просто хочу получить быстрый ответ на проблему, подобную этой, я очень рад просто использовать 'aggregate'. Давайте просто скажем, что я не полностью преобразован в автоматическое использование всех моих данных в качестве 'data.table'. :) – A5C1D2H2I1M1N2O1R2T1

8

Я бы порекомендовал взглянуть на пакет plyr. Возможно, это не так быстро, как data.table или другие пакеты, но это очень поучительно, особенно при запуске с R и необходимости выполнять некоторые манипуляции с данными.

> DF <- data.frame(A = c("1", "1", "2", "3", "3"), B = c(2, 3, 3, 5, 6)) 
> library(plyr) 
> DF.sum <- ddply(DF, c("A"), summarize, B = sum(B)) 
> DF.sum 
    A B 
1 1 5 
2 2 3 
3 3 11 
16

Использование dplyr:

require(dplyr)  
df <- data.frame(A = c(1, 1, 2, 3, 3), B = c(2, 3, 3, 5, 6)) 
df %>% group_by(A) %>% summarise(B = sum(B)) 

## Source: local data frame [3 x 2] 
## 
## A B 
## 1 1 5 
## 2 2 3 
## 3 3 11 

sqldf С:

library(sqldf) 
sqldf('SELECT A, SUM(B) AS B FROM df GROUP BY A') 
4
require(reshape2) 

T <- melt(df, id = c("A")) 

T <- dcast(T, A ~ variable, sum) 

Я не уверен, что точные преимущества над агрегатом.

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