Вычислить несколько средневзвешенных столбцов одновременно в R

Давайте предположим следующий фрейм данных (хотя в моем реальном наборе данных гораздо больше столбцов):

df<- data.frame(date=c(01.01.2010,02.01.2010, 03.01.2010), 
x1=c(1,2,4), y1=c(1,2,3), x2=c(1,2,2), y2=c(3,4,4), x3=c(3,3,3), y3=c(3,4,5))

Date          x1  y1  x2  y2  x3  y3
01.01.2010    1   1   1   3   3   3
02.01.2010    2   2   2   4   3   4
03.01.2010    4   3   2   4   3   5

Во-первых, я хочу вычислить сумму всех столбцов y (каждый второй столбец) как новый столбец с именем y_total и добавить его во фрейм данных. Во-вторых, я хочу вычислить новые столбцы для всех столбцов x, где x1_new= x1*(y1/y_total), x2_new= x2*(y2/y_total), x3_new= x3*(y3/y_total). Я хочу рассчитать все столбцы x1_new, x2_new, n3_new сразу, так как в моем реальном наборе данных у меня до 60 таких столбцов. В конкретном примере это должно выглядеть так:

Date          x1  y1  x2  y2  x3  y3  y_total   x1_new   x2_new   x3_new
01.01.2010    1   1   1   3   3   3     7       0.1428   0.4286   1.286
02.01.2010    2   2   2   4   3   4     10      0.4      0.8      1.2
03.01.2010    4   3   2   4   3   5     12      1        0.6666   1.25

Есть ли способ, как я мог бы вычислить новые столбцы x для каждого старого столбца x одновременно? Я спрашиваю об этом, потому что иногда у меня есть фреймы данных с 90 столбцами x. Заранее спасибо!


person ZayzayR    schedule 20.10.2020    source источник


Ответы (1)


Это работает:

> library(dplyr)
> df %>% mutate(y_total = rowSums(select(., starts_with("y"))), x1_new = x1*(y1/y_total))
        date x1 y1 x2 y2 x3 y3 y_total    x1_new
1 01.01.2010  1  1  1  3  3  3       7 0.1428571
2 02.01.2010  2  2  2  4  3  4      10 0.4000000
3 03.01.2010  4  3  2  4  3  5      12 1.0000000
> 
person Karthik S    schedule 20.10.2020
comment
Это сработает, но мне нужен более автоматизированный способ, так как иногда у меня есть 60 столбцов, где мне нужно выполнить одну и ту же операцию. Так, например, иногда есть x1_new, x2_new,..., x60_new, и я хотел бы рассчитать все эти столбцы более кратким способом. - person ZayzayR; 20.10.2020
comment
Вы можете рассмотреть возможность использования across() из пакета dplyr с starts_with для выбора переменных, соответствующих определенному префиксу. - person iamericfletcher; 20.10.2020
comment
@ZayzayR, изменил мой код, не могли бы вы проверить сейчас. - person Karthik S; 20.10.2020
comment
@KarthikS Спасибо, но, к сожалению, это все еще не решает мою проблему полностью. Я отредактировал свой вопрос, чтобы сделать его более понятным. Мне также нужны столбцы для x2_new, x3_new и так далее. - person ZayzayR; 20.10.2020
comment
Это может быть полезно: R: изменить несколько столбцов на создать новый столбец - person iamericfletcher; 20.10.2020