2015-07-09 2 views
5

У меня есть файл excel с несколькими строками и столбцами (13232 строки и 18 столбцов). Последний столбец дает некоторое значение. То, что я хочу сделать, - найти строки с одинаковыми данными столбца, кроме последнего, и суммировать их последнее значение столбца. Например: , если входОбъединить строки с одинаковыми значениями в нескольких столбцах

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

то вывод должен быть

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

Как это может быть достигнуто в R?

ответ

6

Вы можете использовать aggregate из 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 

Или

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 

Или

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 

Или

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 

Воспроизводимые данные:

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

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

+0

@BrandonBertelsen Мы можем использовать либо метод формулы, либо метод со списком, который вы указали. Спасибо за комментарии – akrun

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