#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))