выполнить одну и ту же операцию для многих столбцов таблицы данных, фрейма данных - PullRequest
0 голосов
/ 29 января 2020

Мне нужно выполнить одну и ту же операцию для каждого столбца для данных, которые подразделяются на значения в другом столбце. Например, принимая пример ниже, для каждого года и каждого Var (1,2,3) мне нужно вычислить функцию cumsum и затем поместить результат в еще 3 столбца (var11, Var22, Var33). Этот результат я буду использовать в дальнейшем для разных сюжетов. Делая это по очереди для каждого года, я получаю длинный кусок кода, который действительно ужасен. Как я могу сделать это более компактным и эффективным способом?

dt<-data.table( YEAR = c("2001", "2000", "2001", "2001","1999", "2000", "2000", "1999", "1999"),
                Var1=sample(0:100, 8, rep=TRUE),
                Var2 =sample(0:500, 8, rep=TRUE),
                Var3 =sample(0:500, 8, rep=TRUE)


)

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Вы можете определить столбцы для создания, т.е.

library(data.table)

dt[, paste0(names(dt)[-1], '_cumsum') := lapply(.SD, cumsum), by = YEAR]

#   YEAR Var1 Var2 Var3 Var1_cumsum Var2_cumsum Var3_cumsum
#1: 2001   68  428  314          68         428         314
#2: 2000   47  244  437          47         244         437
#3: 2001   10  312  406          78         740         720
#4: 2001   89  151   58         167         891         778
#5: 1999   62  289  219          62         289         219
#6: 2000   27  317  198          74         561         635
#7: 2000    3  248  371          77         809        1006
#8: 1999   95  328   19         157         617         238
#9: 1999   68  428  314         225        1045         552
2 голосов
/ 29 января 2020

Вот приборка-решение

bind_cols(dt, dt%>% mutate_at(vars(matches("Var")), cumsum)%>%
        select(-YEAR)%>%
        rename_at(vars(colnames(dt)[-1]), ~ paste0(colnames(dt)[-1], 1:length(colnames(dt)[-1]))))

   YEAR Var1 Var2 Var3 Var11 Var22 Var33
1: 2001   65  326  460    65   326   460
2: 2000   70   57  371   135   383   831
3: 2001   43   40  465   178   423  1296
4: 2001   57  303   83   235   726  1379
5: 1999   37  234  104   272   960  1483
6: 2000    5  382  462   277  1342  1945
7: 2000   15  136  486   292  1478  2431
8: 1999    1  144  444   293  1622  2875
9: 1999   65  326  460   358  1948  3335
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...