У меня есть такой фрейм данных:
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
Как я должен это делать? Спасибо!
Вы можете использовать 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
Если вы хотите сделать это в контексте 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, потому что оно короче. Но из вашего ответа я вижу, как делать подобные преобразования в будущем. Спасибо:)
Спасибо @GKI, мне нравится решение.