2015-02-23 2 views
-1

У меня есть кадр данных с двумя столбцами, столбец Ref_Date и столбец Value. Столбец даты содержит 12 строк для каждого года, с 1988 по 2015 год. Мне нужно сделать это только по году и суммировать столбец Value, чтобы я мог получить только одну строку за каждый год, содержащий сумму всех значений для каждый из 12 месяцев этого года:Рассчитать сумму путем группирования по значению столбца в R

row.names Ref_Date Value 
166483  1989/01  713 
166484  1989/02  771 
166485  1989/03  565 
166486  1989/04  1248 
166487  1989/05  1380 
166488  1989/06  1118 
166489  1989/07  1026 
166490  1989/08  995 
166491  1989/09  835 
166492  1989/10  939 
166493  1989/11  878 
166494  1989/12  1075 
166495  1990/01  878 
166496  1990/02  563 
166497  1990/03  773 
166498  1990/04  1131 
166499  1990/05  1562 
166500  1990/06  1747 
166501  1990/07  1258 
166502  1990/08  791 
+0

Почему это происходит с понижением? – nikaltipar

+0

Это хороший вопрос. –

+3

Он получает downvoted (еще не вниз, но имеет непреодолимое желание сделать это), потому что мы ожидаем публикации изображения от нового пользователя, а не с вашим опытом на сайте. Как мы должны воспроизводить это? Написав каждое отдельное значение вручную? Пожалуйста, следуйте рекомендациям в [этой ссылке] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

ответ

2

Вы можете использовать следующий код с dplyr:

library(dplyr) 
df %>% 
    group_by(year = substr(Ref_Date, 1, 4)) %>%  # create the groups 
    summarise(Value = sum(Value)) 

#Source: local data frame [2 x 2] 
# 
# year Value 
#1 1989 11543 
#2 1990 8703 

или сходным с data.table пакетом

library(data.table) 
setDT(df)[, sum(Value), by = .(year = substr(Ref_Date, 1, 4))] 
# year V1 
#1: 1989 11543 
#2: 1990 8703 

Или с основанием R

with(df, aggregate(Value ~ cbind(year = substr(Ref_Date, 1, 4)), FUN = sum)) 
# year Value 
#1 1989 11543 
#2 1990 8703 
+1

+1 Ударьте меня в это, хотя для новичков может быть более полезно разделить оператор мутации на свою собственную логику - это 'mutate (year = substr (Ref_Date, 1, 4))', за которым следует 'group_by (year) ' – JasonAizkalns

+0

Можете ли вы снова написать это заявление, но без использования труб? –

+0

@JFBeaulieu, я считаю, что это было бы хорошим упражнением для вас. Я уже поманил вас кодом –

1

Другой ответ может быть следующим (с помощью tapply):

years <- 1988:2015 ## or first.year:last.year 
sums <- tapply(df$Value, substr(df$Ref_Date, 1, 4)), sum) 
new.df <- data.frame(years = years, sums = sums) 

EDIT: Просто более общее решение, чтобы избежать стандартных дат (но это в основном похожи к указанному выше):

years <- substr(df$Ref_Date, 1, 4) 
sums <- tapply(df$Value, years, sum) 
new.df <- data.frame(years = unique(years), sum = sums) 
+0

Это сработало для меня ... Просто нужно было изменить вторую строку: sums <- tapply (as.numeric (df $ Value), substr (df $ Ref_Date, 1, 4), sum) –

+0

О, я рад, что так и было, я понятия не имел, что вы сохранили значения как строки. Но, в конце концов, все в порядке. – nikaltipar

+0

Это решение в основном @docendos. Должен быть комментарий в лучшем случае, но что угодно. –

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