#r
#r
Вопрос:
Я хотел бы посчитать, какое максимальное значение в каждой строке, и разделить каждую ячейку на это число, см. Пример ниже.
col1 col2
row1 3 5
row2 4 10
row3 3 20
calculation
col1 col2
row1 3/5 5/5
row2 4/10 10/10
row3 3/20 20/20
output
col1 col2
row1 0.6 1
row2 0.4 1
row3 0.15 1
Комментарии:
1. Может
apply(x, 1, function(x) x/max(x))
быть?2. Эта функция переворачивает столбцы и строки. Знаете ли вы, что нужно сделать, чтобы строки оставались строками, а столбцы — столбцами?
3.
t(apply(x, 1, function(x) x/max(x)))
4. Другой вариант:
df / do.call(pmax, df)
Ответ №1:
Вот решение с tidyverse
.
library(tidyverse)
df <- data.frame(
col1 = c(3L, 4L, 3L),
col2 = c(5L, 10L, 20L)
)
df %>%
rowwise() %>%
mutate(max_num=max(c_across(cols=everything()))) %>%
ungroup() %>%
mutate(across(.cols = starts_with("col"), .fns=function(x) x/max_num))
#> # A tibble: 3 x 3
#> col1 col2 max_num
#> <dbl> <dbl> <int>
#> 1 0.6 1 5
#> 2 0.4 1 10
#> 3 0.15 1 20
Создано 2020-11-30 пакетом reprex (версия 0.3.0)
Ответ №2:
Это более синтетический способ, использующий base
col1 <- c(3,4,3)
col2 <- c(5,10,20)
df <- data.frame(col1,col2)
result <- t(apply(df,1, function(x) x/max(x)))
> result
col1 col2
[1,] 0.60 1
[2,] 0.40 1
[3,] 0.15 1
По сути, вам нужно применить функцию x/max(x)
к строкам df
, которые означают, что вам нужно использовать 1
в margin
параметре apply
, а затем t
транспонировать.