Сбой последовательных вычислений в R

#r #dataframe #sequence #calculation

#r #фрейм данных #последовательность #вычисление

Вопрос:

Я попытался выполнить некоторые вычисления с константой и несколькими переменными в фрейме данных.

Например, мы можем использовать следующие фиктивные данные

 constant <- 100
df <- as.data.frame(cbind(c(1,2,3,4,5),
            c(4,3,6,1,4),
            c(2,5,6,6,2),
            c(5,5,5,1,2),
            c(3,6,4,3,1)))
colnames(df) <- c("aa", "bb", "cc", "dd", "ee")
  

Теперь предположим, что для каждой строки в моем фрейме данных я хочу последовательно умножить свою константу на переменную bb, затем cc, а затем dd. Я пытался

 answers <- sapply(df, function(x) constant * (1   x[,2:4])
  

и аналогичные попытки с lapply.

Как бы мне поступить, чтобы получить мой: constant * bb * cc * dd? Это проценты, поэтому у меня есть (1 … там

Ответ №1:

Попробуйте этот подход с apply() :

 #Data
constant <- 100
df <- as.data.frame(cbind(c(1,2,3,4,5),
                          c(4,3,6,1,4),
                          c(2,5,6,6,2),
                          c(5,5,5,1,2),
                          c(3,6,4,3,1)))
colnames(df) <- c("aa", "bb", "cc", "dd", "ee")
#Apply
answers <- as.data.frame(t(apply(df,1, function(x) constant * (1   x))))
  

Вывод:

 answers
   aa  bb  cc  dd  ee
1 200 500 300 600 400
2 300 400 600 600 700
3 400 700 700 600 500
4 500 200 700 200 400
5 600 500 300 300 200
  

Или dplyr с помощью across() :

 library(dplyr)
#Code
answer <- df %>% mutate(across(everything(),~constant * (1   .)))
  

Вывод:

    aa  bb  cc  dd  ee
1 200 500 300 600 400
2 300 400 600 600 700
3 400 700 700 600 500
4 500 200 700 200 400
5 600 500 300 300 200
  

Или с тем же sapply() :

 #Code 3
answers <- sapply(df,function(x) constant * (1   x))
answers <- as.data.frame(answers)
  

Вывод:

    aa  bb  cc  dd  ee
1 200 500 300 600 400
2 300 400 600 600 700
3 400 700 700 600 500
4 500 200 700 200 400
5 600 500 300 300 200
  

Или любой из этих параметров выдаст тот же результат:

 #Code 4
answers <- as.data.frame(do.call(cbind,lapply(df,function(x) constant * (1   x))))
#Code 5
answers <- as.data.frame(mapply(function(x) constant * (1   x),x=df))