Подтвердить что ты не робот

Data.frame Группа по столбцу

У меня есть фрейм данных DF.

Скажите, что DF:

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

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

Например:

  A B
1 1 5
2 2 3
3 3 11

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

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

4b9b3361

Ответ 1

Это общий вопрос. В базовом варианте вы можете выбрать 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

Ответ 2

Использование 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')

Ответ 3

Я бы порекомендовал взглянуть на пакет 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

Ответ 4

require(reshape2)

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

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

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