умножение столбцов в R - PullRequest
0 голосов
/ 05 мая 2018

У меня есть такой фрейм данных.

> abc
   ID 1.x 2.x 1.y 2.y
1   4  10  20  30  40
2  16   5  10   5  10
3  42  16  17  18  19
4  91  20  20  20  20
5 103 103  42  56  84

Как мне создать два дополнительных столбца '1' и '2' путем умножения 1.x * 1.y и 2.x * 2.y в обобщенном виде?

Я пытаюсь получить обобщенное решение, в котором число столбцов может быть слишком большим. Поэтому я хочу умножить все х на все у. В то время как x и y фиксированы, n должно быть вычислено из фрейма данных.

Для простоты предположим, что n также фиксировано, но это большое число.

Я могу попробовать одну вещь: -

abc[,c(6,7)]=abc[,c(2,3)]*abc[,c(4,5)] Это будет работать, только если позиции col смежные. Это достаточно хорошо для меня. Если у кого-то может быть более обобщенное решение, оно принесет пользу всем нам.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Mutate сохранит исходные переменные. Mutate_all позволит вам умножить все столбцы в вашем фрейме данных.

abc %>%
  mutate(new_vary1 = `1.x`* `2.x`,
         new_vary2 = `1.y`* `2.y`) %>%
  mutate_all(funs(.*`1.x`))
0 голосов
/ 05 мая 2018

Если есть только несколько переменных для умножения, мы можем сделать это с помощью transform, умножив интересующие столбцы

transform(abc, new1 = `1.x`*`1.y`, new2 = `2.x`*`2.y`, check.names = FALSE)
#   ID 1.x 2.x 1.y 2.y new1 new2
#1   4  10  20  30  40  300  800
#2  16   5  10   5  10   25  100
#3  42  16  17  18  19  288  323
#4  91  20  20  20  20  400  400
#5 103 103  42  56  84 5768 3528

Если у нас много столбцов, то один из подходов состоит в split наборе данных в list data.frames, взяв подстроку имен, а затем перебрав list и умножив строки на do.call

abc[paste0("new", 1:2)] <- lapply(split.default(abc[-1], 
   sub("\\.[a-z]+$", "", names(abc)[-1])), function(x) do.call(`*`, x))

Или другой вариант (основанный на умножении попарных столбцов)

apply(aperm(array(unlist(abc[-1]), c(5, 2, 2)),
            c(3, 1, 2)), 3, matrixStats::colProds)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...