2016-04-26 2 views
2

Here is a link to my data. Это выглядит следующим образом:R петля длинный возврат данных минимальный и суммарные значения

year cars company 
1975 11.75 chevy 
1976 19.71 chevy 
1977 21.23 chevy 
1978 11.00 chevy 
1979 8.26 chevy 
1980 8.63 chevy 
1981 19.09 chevy 
1982 30.52 chevy 
1983 27.51 chevy 

Я хотел бы создать две новые переменные столбцы:

  1. year_first, который будет возвращать первый год компания указана в данных (например, это было бы " 1975" для каждого „шевроле“ строка)
  2. cars_cumulative, который будет возвращать кумулятивный итог для всех автомобилей для конкретной компании производится до того момента

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

year cars company year_first cars_cumulative 
1975 11.75 chevy 1975  11.75 
1976 19.71 chevy 1975  31.46 
1977 21.23 chevy 1975  52.69 
1978 11.00 chevy 1975  63.69 
1979 8.26 chevy 1975  71.95 
1980 8.63 chevy 1975  80.58 
1981 19.09 chevy 1975  99.67 
1982 30.52 chevy 1975  130.19 
1983 27.51 chevy 1975  157.70 

Предполагаю, что я должен написать цикл for? Я просто не уверен, как это сделать.

ответ

6

следующая методика базовой Р должна работать на data.frame ДФ:

df <- data.frame(year=1975:1983, 
       cars=c(11.75, 19.71, 21.23, 11, 8.26, 8.63, 19.09, 30.52, 27.51), 
       company=rep("chevy", length(1975:1983))) 
# add variables 
df$year_first <- ave(df$year, df$company, FUN=min) 
df$cars_cumulative <- ave(df$cars, df$company, FUN=cumsum) 

Хорошее дополнение упомянутый @rawr, является то, что эти линии выше, могут быть завернуты в within, который говорит R, чтобы использовать данные, .frame в качестве первой точки отсчета:

within(df, { 
    year_first <- ave(year, company, FUN=min) 
    cars_cumulative <- ave(cars, company, FUN=cumsum) 
}) 

использование within не только экономит типирование многих «ДФ $» префиксов, что делает код более удобным для чтения, но она также может помочь организовать код , так как вы можете создать все ваших дополнительных переменных в один блок кода.

Если вы работаете с очень большим набором данных, или вы, как сжатое код, вы можете взглянуть на data.table:

library(data.table) 
setDT(df) 
df[, c("year_first", "cars_cumulative"):=list(min(year), cumsum(cars)), by="company"] 
# or 
df[, `:=`(year_first = year[1L], cars_cumulative = cumsum(cars)), by=company] 

или с dplyr:

library(dplyr) 
df2 = df %>% group_by(company) %>% 
    mutate(year_first = first(year), cars_cumulative = cumsum(cars)) 
+1

Позвольте мне взять первый трещина в методе data.table. Если будут улучшения, я был бы рад узнать их. – lmo

+0

OK @Frank. отредактировать. – lmo

+0

Это прекрасно. Никогда не знал о функции ave. Невероятно полезно. Благодаря! @Frank – Jim

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