Подсчитайте, какое максимальное значение в каждой строке, и разделите каждую ячейку на это число (в R)

#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 транспонировать.