2015-07-09 20 views
5

Mam plik programu Excel z wieloma wierszami i kolumnami (13232 wiersze i 18 kolumn). Ostatnia kolumna daje pewną wartość. Chcę tylko znaleźć wiersze z tymi samymi szczegółami kolumny, z wyjątkiem ostatniego i zsumować ich ostatnią wartość kolumny. Na przykład: jeśli wejście jestScalanie wierszy mających te same wartości w wielu kolumnach

+---------+---------+---------+---------+ 
| Column1 | Column2 | Column3 | Column4 | 
+---------+---------+---------+---------+ 
| ABC  | DEF  | GHI  |  5 | 
| XYZ  | PQR  | LMN  |  4 | 
| ABC  | DEF  | GHI  |  11 | 
| Test1 | Test2 | Test3 |  12 | 
| XYZ  | PQR  | LMN  |  54 | 
+---------+---------+---------+---------+ 

następnie wyjście powinno być

+---------+---------+---------+---------+ 
| Column1 | Column2 | Column3 | Column4 | 
+---------+---------+---------+---------+ 
| ABC  | DEF  | GHI  |  16 | 
| XYZ  | PQR  | LMN  |  58 | 
| Test1 | Test2 | Test3 |  12 | 
+---------+---------+---------+---------+ 

Jak to można osiągnąć w R?

Odpowiedz

6

Można użyć aggregate z base R

aggregate(Column4~., df1, FUN=sum) 
# Column1 Column2 Column3 Column4 
#1  ABC  DEF  GHI  16 
#2  XYZ  PQR  LMN  58 
#3 Test1 Test2 Test3  12 

Or

library(data.table) 
setDT(df1)[, list(Column4=sum(Column4)), by = c(names(df1)[1:3])] 
#  Column1 Column2 Column3 Column4 
#1:  ABC  DEF  GHI  16 
#2:  XYZ  PQR  LMN  58 
#3: Test1 Test2 Test3  12 

Albo

library(sqldf) 
sqldf('select Column1, Column2, Column3, 
      sum(Column4) as Column4 
      from df1 
      group by Column1, Column2, Column3') 
# Column1 Column2 Column3 Column4 
#1  ABC  DEF  GHI  16 
#2 Test1 Test2 Test3  12 
#3  XYZ  PQR  LMN  58 

Albo

library(dplyr) 
df1 %>% group_by(Column1, Column2, Column3) %>% 
    summarize(Column4 = sum(Column4)) 
# Source: local data frame [3 x 4] 
# Groups: Column1, Column2 

# Column1 Column2 Column3 Column4 
# 1  ABC  DEF  GHI  16 
# 2 Test1 Test2 Test3  12 
# 3  XYZ  PQR  LMN  58 

Powtarzalne dane:

df1 <- 
structure(list(Column1 = structure(c(1L, 3L, 1L, 2L, 3L), .Label = c("ABC", 
"Test1", "XYZ"), class = "factor"), Column2 = structure(c(1L, 
2L, 1L, 3L, 2L), .Label = c("DEF", "PQR", "Test2"), class = "factor"), 
    Column3 = structure(c(1L, 2L, 1L, 3L, 2L), .Label = c("GHI", 
    "LMN", "Test3"), class = "factor"), Column4 = c(5L, 4L, 11L, 
    12L, 54L)), .Names = c("Column1", "Column2", "Column3", "Column4" 
), class = "data.frame", row.names = c(NA, -5L)) 
+0

nie wiedziałem, można użyć kruszywo tak bezpośrednio jak to. Doskonały. Myślałem, że musisz podać bardziej przejrzystą zmienną. –

+0

@BrandonBertelsen Możemy użyć metody formuły lub tej z listą, jak pokazano. Dziękuję za komentarze – akrun

Powiązane problemy