在变异函数中乘以所选行的总和

时间:2018-10-03 12:05:37

标签: r dplyr

非常感谢您在使用mutate_at方面的帮助。

我想将一个值乘以相应行的总和。但是,第一列包含ID,因此应将其忽略。它应该朝以下方向发展,但我做对了。

library("dplyr")

df <- data.frame(id = c(101,102,103,104),
                 t_1 = sample(0:100, 4)/100,
                 t_2 = sample(0:100, 4)/100,
                 t_3 = sample(0:100, 4)/100,
                 t_4 = sample(0:100, 4)/100)

df %>% mutate_at(vars(starts_with("t_")),
                 funs(adjusted = 1/rowSums(select(., starts_with("t_")))*.))

有人知道什么建议吗?预先谢谢你!

2 个答案:

答案 0 :(得分:0)

嗨, 这是一些没有mutate_at的解决方案:

nominator <- apply(df[,-1], 1, sum)
df[,-1] <- df[,-1]/nominator

这将首先将行总和计算为nominator,并将df的每个行条目(第一个条目除外)除以行标识符。

答案 1 :(得分:0)

这不是一个非常有效的解决方案,但可以起作用:

df %>%
  mutate(temp = rowSums(select(., grep("t_", names(df), value = TRUE)))) %>%
  mutate_at(vars(starts_with("t_")), funs(adjusted = 1/temp*.)) %>%
  select(-temp)

   id        t_1        t_2       t_3        t_4 t_1_adjusted t_2_adjusted t_3_adjusted t_4_adjusted
1 101 0.02822581 0.39919355 0.3185484 0.25403226   0.02822581   0.39919355    0.3185484   0.25403226
2 102 0.60273973 0.06849315 0.0000000 0.32876712   0.60273973   0.06849315    0.0000000   0.32876712
3 103 0.42285714 0.05142857 0.4400000 0.08571429   0.42285714   0.05142857    0.4400000   0.08571429
4 104 0.34934498 0.34061135 0.3100437 0.00000000   0.34934498   0.34061135    0.3100437   0.00000000