2014-11-26 7 views
0

У меня есть набор данных, как этотКак суммировать дублируемое значение, сохраняя остальные столбцы?

V0 V1 V2 V3 X  Y 
#1 1 A 21 31 123 12 
#2 2 A 21 31 245 24 
#3 3 B 22 32 234 25 
#4 4 C 23 33 190 30 
#5 5 C 23 33 210 20 

Таким образом, есть дублируется значение в V1, V2 и V3; и я хотел бы создать набор данных, как это, сумма которых до X и Y соответственно, V1-V3

V1 V2 V3 X  Y V 
#1 A 21 31 368 36 1,2 
#2 B 22 32 234 25 3 
#3 C 23 33 400 50 4,5 

Я пытался «агрегат», как показано ниже, но не имеют ни малейшего представления о том, как сделать это с обеих X и Y вместе, и в то же время сохранить V2 и V3 в качестве исходного значения, а не суммировать их. И как я могу поместить значение в V0 в пределах той же группы (V1) в другую новую переменную.

df.sum <- aggregate(X~V1,data=df,FUN=sum) 

Я пытаюсь объединить «df.sum» с «ДФ» по «V1» после этого, но оказывается, что все дублируется значение были объединены, а также.

Любое предложение? Большое спасибо!

ответ

3

Или dplyr

library(dplyr) 
df %>% group_by(V1,V2,V3) %>% summarise(X_sum=sum(X), Y_sum= sum(Y)) 
# Or as suggested, you could also do: 
df %>% group_by(V1,V2,V3) %>% summarise_each(funs(sum)) 

#Source: local data frame [3 x 5] 
#Groups: V1, V2 
# 
# V1 V2 V3 X_sum Y_sum 
#1 A 21 31 368 36 
#2 B 22 32 234 25 
#3 C 23 33 400 50 

# data 
df <- structure(list(V1 = structure(c(1L, 1L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), V2 = c(21L, 21L, 22L, 23L, 23L), 
    V3 = c(31L, 31L, 32L, 33L, 33L), X = c(123L, 245L, 234L, 
    190L, 210L), Y = c(12L, 24L, 25L, 30L, 20L)), .Names = c("V1", 
"V2", "V3", "X", "Y"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5")) 

Что касается обновленных данных, вы могли бы сделать что-то вроде:

df %>% group_by(V1,V2,V3) %>% 
    summarise_each(funs(sum, toString), X, Y, V0) %>% 
    select(-V0_sum, 
     -X_toString, 
     -Y_toString) 
# you get 
# V1 V2 V3 X_sum Y_sum V0_toString 
# 1 A 21 31 368 36  1, 2 
# 2 B 22 32 234 25   3 
# 3 C 23 33 400 50  4, 5 

# data 
df <- structure(list(V0 = 1:5, V1 = structure(c(1L, 1L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), V2 = c(21L, 21L, 22L, 23L, 23L), 
    V3 = c(31L, 31L, 32L, 33L, 33L), X = c(123L, 245L, 234L, 
    190L, 210L), Y = c(12L, 24L, 25L, 30L, 20L)), .Names = c("V0", 
"V1", "V2", "V3", "X", "Y"), class = "data.frame", row.names = c(NA, 
-5L)) 
+1

Почему бы не 'summise_each'? ('mydf%>% group_by (V1, V2, V3)%>% summaryise_each (funs (sum))') – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, уверен, что он одинаково работает. Но хотелось бы назначить персонализированные имена столбцов. – KFB

+0

Я получил «Ошибка в пустом (.data): не смог найти функцию«%>% »после ее запуска. любая идея, что происходит не так? И я также отредактировал мой вопрос, добавив слияние переменной (V0). Спасибо! – cyrusjan

3

Вы на правильном пути. Вобще:

aggregate(. ~ V1 + V2 + V2, mydf, sum) 
# V1 V2 V3 X Y 
# 1 A 21 62 368 36 
# 2 B 22 32 234 25 
# 3 C 23 66 400 50 

Вы также можете сделать это во многих других отношениях. Например, вот подход с использованием "data.table":

library(data.table) 
as.data.table(mydf)[, lapply(.SD, sum), by = list(V1, V2, V3)] 
+2

Или спиннинг его around - 'aggregate (cbind (X, Y) ~., data = dat, FUN = sum)' – thelatemail

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