2015-09-14 7 views
1

Is возможно, что из следующего кадра данных df1Несколько функций в совокупности

Branch Loan_Amount TAT 
     A   100 2.0 
     A   120 4.0 
     A   300 9.0 
     B   150 1.5 
     B   200 2.0 

можно использовать агрегатную функцию, чтобы получить следующий вывод как dataframe df2

Branch Number_of_loans Loan_Amount Total_TAT 
     A    3   520  15.0 
     B    2   350  3.5 

Я знаю, что могу использовать чтобы вычислить number_of_loans и слить, но я ищу лучший метод.

+1

Почему 'aggregate' не является хорошим способом для вас? –

ответ

2

С dplyr, вы можете сделать это:

library(dplyr) 
group_by(d,Branch) %>% 
    summarize(Number_of_loans = n(), 
      Loan_Amount = sum(Loan_Amount), 
      TAT = sum(TAT)) 

выходных данных

Source: local data frame [2 x 4] 

    Branch Number_of_loans Loan_Amount TAT 
    (fctr)   (int)  (int) (dbl) 
1  A    3   520 15.0 
2  B    2   350 3.5 

d <- read.table(text="Branch Loan_Amount TAT 
A   100 2.0 
A   120 4.0 
A   300 9.0 
B   150 1.5 
B   200 2.0",head=TRUE) 
2

Базовый пакет:

df1 <- aggregate(.~ Branch, df, FUN = "sum") 
df2 <- setNames(aggregate(Loan_Amount~Branch, df, length)[2], c("Number_of_loans")) 
cbind(df1, df2) 

Выход

Branch Loan_Amount TAT Number_of_loans 
1  A   520 15.0    3 
2  B   350 3.5    2 

sqldf Пакет:

library(sqldf) 
sqldf("SELECT Branch, COUNT(Loan_Amount) Number_of_loans, SUM(Loan_Amount) Loan_Amount, SUM(TAT) TAT 
     FROM df 
     GROUP BY Branch") 

Выход

Branch Number_of_loans Loan_Amount TAT 
1  A    3   520 15.0 
2  B    2   350 3.5 

данных

df <- structure(list(Branch = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), Loan_Amount = c(100L, 120L, 300L, 150L, 
200L), TAT = c(2, 4, 9, 1.5, 2)), .Names = c("Branch", "Loan_Amount", 
"TAT"), class = "data.frame", row.names = c(NA, -5L)) 
2

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

library(data.table) 
setDT(df)[,list(Number_of_loans=.N, 
       Loan_Amount =sum(Loan_Amount), 
       Total_TAT  =sum(TAT)), by=Branch] 
# Branch Number_of_loans Loan_Amount Total_TAT 
# 1:  A    3   520  15.0 
# 2:  B    2   350  3.5 
Смежные вопросы