Примените построчное преобразование в R, чтобы общий процент для каждой строки был равен 100%

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

df <- structure(list(groups= c("group1", "group2", "group3", "group4"), 
                 A = c(28.6, 26.7, 29.1,23.1,1.0),
                 B = c(24.5, 22.3,23.9,20.2,1.5),
                 C = c(12.1,11.2,12.1,11.7,1.5),
                 D = c(9.4,7.0,9.0,8.7,1.1)),
                 class = "data.frame", 
                 row.names = c("1","2","3","4"))


   groups     A       B      C      D  

1  group1   28.6    24.5    12.1   9.4
2  group2   26.7    22.3    11.2   7.0
3  group3   29.1    23.9    12.1   9.0
4  group4   23.1    20.2    11.7   8.7

Значения в фрейме данных указаны в процентах. Я хотел бы увеличить общий процент для каждой строки до 100%. Таким образом, результат будет выглядеть примерно так (кстати, я рассчитал ожидаемый результат вручную, поэтому он может быть не таким точным, как рассчитанный компьютером):

 groups     A       B      C      D  

1  group1   38.3    32.8    16.2   12.6
2  group2   39.7    33.1    16.7   10.4
3  group3   39.7    32.6    16.4   11.3
4  group4   36.3    31.5    18.9   13.3

Как я должен это делать? Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать proportions, чтобы получить проценты.

proportions(as.matrix(df[1:4,-1]), 1) * 100
#         A        B        C        D
#1 38.33780 32.84182 16.21984 12.60054
#2 39.73214 33.18452 16.66667 10.41667
#3 39.27126 32.25371 16.32928 12.14575
#4 36.26374 31.71115 18.36735 13.65777

Спасибо @GKI, мне нравится решение.

almo 23.12.2020 15:09

Если вы хотите сделать это в контексте dplyr:

df %>% 
  rowwise() %>% 
  mutate(sm = sum(c_across(-groups))) %>% 
  mutate(across(A:D, function(x)x/sm)*100) %>% 
  select(-sm)
## A tibble: 5 x 5
## Rowwise: 
#  groups     A     B     C     D
#  <chr>  <dbl> <dbl> <dbl> <dbl>
#1 group1  38.3  32.8  16.2  12.6
#2 group2  39.7  33.2  16.7  10.4
#3 group3  39.3  32.3  16.3  12.1
#4 group4  36.3  31.7  18.4  13.7
#5 group5  19.6  29.4  29.4  21.6

Спасибо @DaveArmstrong. Я выбрал решение GKi, потому что оно короче. Но из вашего ответа я вижу, как делать подобные преобразования в будущем. Спасибо:)

almo 23.12.2020 15:10

Другие вопросы по теме