有什么方法可以使用行总和替换 R 中 df 的值吗?

Is there any way to replace values of df in R using sum of rows?

我有一个看起来很容易解决的问题,但我被卡住了。我有一个由列(从 GSEA 检索到的重要途径)和行(entrez 基因 ID)组成的数据框。在此数据框中,如果基因存在于通路中则为 1,否则为 0。这是我的数据框:

                         Path_A      Path_B       Path_C
Gene_1                   0           1            0
Gene_2                   1           1            0
Gene_3                   0           0            1
Gene_4                   1           1            1

我想对行(基因)求和以计算一个基因在不同途径中存在的次数,从而得到如下结果:

                          Path_A      Path_B       Path_C
Gene_1                   0           1            0
Gene_2                   2           2            0
Gene_3                   0           0            1
Gene_4                   3           3            3

在这一点上,我尝试使用my_df <- mutate(my_df, sum = rowSums(my_df))创建一个新列sum,然后为每个路径列重新编码 1 和 sum 值;然而,我失败了。

提前致谢

使用rowSums,按行复制并分配给行

df1[] <- rowSums(df1, na.rm = TRUE)[row(df1)] * df1

-输出

> df1
       Path_A Path_B Path_C
Gene_1      0      1      0
Gene_2      2      2      0
Gene_3      0      0      1
Gene_4      3      3      3

数据

df1 <- structure(list(Path_A = c(0L, 1L, 0L, 1L), Path_B = c(1L, 1L, 
0L, 1L), Path_C = c(0L, 0L, 1L, 1L)), class = "data.frame", 
row.names = c("Gene_1", 
"Gene_2", "Gene_3", "Gene_4"))

您可以使用 dplyr 但 akrun 发布的基础 R 解决方案更合理:

library(dplyr)

df1 %>% 
  mutate(across(Path_A:Path_C, ~ .x * rowSums(across(Path_A:Path_C))))

returns

       Path_A Path_B Path_C
Gene_1      0      1      0
Gene_2      2      2      0
Gene_3      0      0      1
Gene_4      3      3      3

这是一个 dplyr 变体: 我想将 acrossrowSums 一起使用,但正如我最近了解到的: 在 rowSums 中使用 . 绕过 across() 我们可以使用 helper 列:

library(dplyr)
df1 %>% 
    mutate(helper = rowSums(.)) %>% 
    mutate(across(everything(), ~ifelse(. != 0, helper, .))) %>% 
    select(-helper)
       Path_A Path_B Path_C
Gene_1      0      1      0
Gene_2      2      2      0
Gene_3      0      0      1
Gene_4      3      3      3