Перебор переменных в R

Я пытаюсь улучшить свои коды R, и мне интересно, как я могу перебрать эти переменные/подобную проблему, чтобы уменьшить длину кода? Я предполагаю, что должно быть очень простое решение, но почему-то я не могу его понять.

df$zx1 <- with(df, var1*(x1/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx2 <- with(df, var1*(x2/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx3 <- with(df, var1*(x3/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx4 <- with(df, var1*(x4/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx5 <- with(df, var1*(x5/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx6 <- with(df, var1*(x6/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx7 <- with(df, var1*(x7/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx8 <- with(df, var1*(x8/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx9 <- with(df, var1*(x9/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))
df$zx10 <- with(df, var1*(x10/(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)))

Любые входы высоко ценятся!


person Kat    schedule 28.07.2020    source источник
comment
Все эти 10 строк можно заменить чем-то вроде df[paste0("zx", 1:10)] <- df$var1 * df[-1] / rowSums(df[-1]) (при условии, что var1 — это первый столбец, а все остальные — x1:x10). В противном случае, пожалуйста, предоставьте пример ваших данных   -  person David Arenburg    schedule 28.07.2020


Ответы (2)


Предположим, что var1 — первая переменная в df, а x1, x2, x3 и т. д. — все остальные. Что это должно делать:

for(i in 1:10){
 df[ , paste0("zx", i)] <- df$var1 * df[ , paste0("x", i)]/rowSums(df[2:11])
}
person Vesnič    schedule 28.07.2020
comment
Большое спасибо за ваш быстрый ответ. Каким-то образом я получаю сообщение об ошибке с нечисловым аргументом для бинарного оператора - я попробовал его на игрушечном примере, и он работает, но с моим исходным набором данных это не так. Я проверил NA и class() переменных, и все кажется в порядке (нет NA, все числовые). Есть ли у вас какое-либо представление об этом сообщении об ошибке или о том, что еще я мог бы проверить? - person Kat; 28.07.2020
comment
Проверьте, являются ли ваши переменные числовыми. Эта ошибка обычно возникает, когда вы пытаетесь использовать операторы для нечисловых переменных (пример: 1 + one выдаст вам эту ошибку) - person Vesnič; 28.07.2020
comment
Я нашел ошибку - мои данные не были data.frame... но в остальном ваше решение работало как шарм! Большое спасибо :) - person Kat; 28.07.2020

Используя dplyr, вы можете попробовать:

library(dplyr)
df <- data.frame(var1 = 1:5, x1 = 2:6, x2 = 3:7, x3 = 1:5)

df %>%
  mutate(row_sum = rowSums(.[-1])) %>%
  mutate(across(starts_with('x'), ~var1 * ./row_sum, .names  = 'zx_{col}'))
  #For dplyr < 1.0.0
  #mutate_at(vars(starts_with('x')), list(zx = ~var1 * ./row_sum))


#  var1 x1 x2 x3 row_sum     zx_x1     zx_x2     zx_x3
#1    1  2  3  1       6 0.3333333 0.5000000 0.1666667
#2    2  3  4  2       9 0.6666667 0.8888889 0.4444444
#3    3  4  5  3      12 1.0000000 1.2500000 0.7500000
#4    4  5  6  4      15 1.3333333 1.6000000 1.0666667
#5    5  6  7  5      18 1.6666667 1.9444444 1.3888889
person Ronak Shah    schedule 28.07.2020
comment
ваш опыт необходим, так как из-за какой-то проблемы я заблокирован здесь, чтобы спросить it-into-individual-fi/63142069#63142069" title="сохранение вывода tidypmc, который формирует объект списка, и сохранение его в отдельный файл"> stackoverflow.com/questions/63138416/ - person krushnach Chandra; 29.07.2020