создать комбинацию выбранных столбцов в df - PullRequest
0 голосов
/ 30 апреля 2018

Давайте начнем с этого фрейма данных. Давайте назовем их temp и ppt столбцами для столбцов, начинающихся с t and p соответственно.

df <- data.frame(id = 1:4, area = rnorm(4, 123), t_p25 = rnorm(4, 2), t_p30 = rnorm(4, 0.5), 
     t_m25 = rnorm(4, 3), p1 = rnorm(4, 7), p_1 = rnorm(4, 10), p2 = rnorm(4, 3), p_2 = rnorm(4, -1))

Моя конечная цель - создать столбец W, который рассчитывается как W = temp * ppt * area * {other columns as well}.

Например:
W_t_p25_p1 = t_p25 * p1 * area
W_t_p25_p_1 = t_p25 * p_1 * area
W_t_m25_p1 = t_m25 * p1 * area W_t_m25_p_1 = t_m25 * p_1 * area и т. Д.

Вот как они мне нужны ::

id area  W_t_p25_p1  W_p_25_p_1  W_p_25_p2  W_p_25_p_2  W_t_p30_p1  W_t_p30_p_1  W_p_25_p2  W_p_25_p_2  ... and so on
#   ##            #           #          #           #           #            #          #           #   and so on

Было бы утомительно делать это вручную. Я пытался решить это с mutate_at, но .vars - это ограничение. Если бы только это можно было сделать ::

df %>% mutate_at( .vars1 = colnames(.)[grep("^t_", colnames(.)],
                  .vars2 = colnames(.)[grep("^p", colnames(.)],
                  .funs = calc.W( .vars1, .vars2 , area)
                 )

Есть ли более простой способ сделать что-то подобное?

1 Ответ

0 голосов
/ 30 апреля 2018

Вот одно решение, которое я могу придумать (вы можете настроить индексы в зависимости от того, сколько строчных и прописных букв существует в вашем df:

egrid <- expand.grid(names(df)[3:5], names(df)[6:9])
result <- as.data.frame(apply(egrid, 1, function(x) df$area * df[[x[1]]] * df[[x[2]]]))

colnames(result) <- paste0('W_', egrid$Var1, egrid$Var2)
result <- cbind(df[, 1:2], result)
result

  id     area     W_aA       W_bA     W_cA     W_aB       W_bB     W_cB      W_aC       W_bC     W_cC       W_aD        W_bD        W_cD
1  1 122.6077 2004.342 1235.42437 3253.378 2882.802 1776.88439 4679.264  795.9592 490.608589 1291.973 -976.96029 -602.172981 -1585.76799
2  2 126.1399 1713.637  -62.30608 2147.569 2483.034  -90.28058 3111.795 1291.2969 -46.950231 1618.283  221.76815   -8.063262   277.92486
3  3 120.9471 1282.721   -9.47124 4080.824 1790.517  -13.22066 5696.317  682.9681  -5.042838 2172.781 -159.77938    1.179764  -508.31898
4  4 121.7203 1634.049  392.82541 2938.293 2262.283  543.85269 4067.961  833.1827 200.297098 1498.201   13.87204    3.334838    24.94424
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...