有什么方法可以使用行总和替换 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
变体:
我想将 across
与 rowSums
一起使用,但正如我最近了解到的: 在 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
我有一个看起来很容易解决的问题,但我被卡住了。我有一个由列(从 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
变体:
我想将 across
与 rowSums
一起使用,但正如我最近了解到的: 在 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