使用特定列的值从其他行中减去,但列索引在 R 中的文件之间移动

Using a specific column's values to subtract from other rows but the column index moves between files in R

数据 我还有癌症患者 (case_totals) 和非癌症患者 (control_totals) 的总数,在这种情况下分别是 100 和 1000。

Variant  Cancer IBD AKI CKD CCF IHD
A1         0    5   4   0   0   4
A2         0    8   5   9   0   7
A3         20   9   6   7   0   3
B5         7    2   0   6   5   4
K7         9    1   8   4   2   5
L9         0    0   6   3   3   1

期望的结果 - 两个表: 表 1:

 Variant     case_total not_seen_in_cases_total control_total not_seen_in_control_total
    A1             0           100                    13                  987  
    A2             0           100                    25                  975 
    A3             20          80                     25                  975
    B5             7           93                     17                  983
    K7             9           91                     20                  980
    L9             0           100                    13                  987

表 2:

case_total_in_gene  not_seen_in_gene_cases      control_total_in_gene control_total_not_in_gene
36                         64                            113                 887

然后我将 运行 两个表中的渔民以获得每个变体和每个基因 p.value 我可以做到。

我的问题是我有多个这样的数据集,并且每个数据集的输入列顺序都不同。目前我一直在用:

ncol(dt) #to get the total number of columns as in reality the table is very large
which(colnames(dt)=='Cancer') #get the index column 
dt$control_total <- (rowSums(dt[,2:7])) - rowSums(dt[,2]) #get a control totals per row column 

然后对 dt 进行子集化,然后使用减法将其他列相加,例如dt$not_seen_in_control_total <- 1000 - dt$control_total

这不适用于移动列索引,我想 运行 最好使用 commandArgs 跨数百个文件。

最终,我如何引用始终具有相同名称但在 RowSums 等函数中位于不同位置的列?

非常感谢

您可以 select 按名称中的位置或模式或指定列范围来命名列。这取决于您的数据结构。

library(dplyr)

table1 <- df %>%
  mutate(control_total = rowSums(select(., setdiff(2:ncol(.), 
                                 match('Cancer', names(.)))))) %>%
  transmute(Variant, Cancer, 
            not_seen_in_cases_total = 100 - Cancer, 
            control_total, 
            not_seen_in_control_total = 1000 - control_total)
table1

#  Variant Cancer not_seen_in_cases_total control_total not_seen_in_control_total
#1      A1      0                     100            13                       987
#2      A2      0                     100            29                       971
#3      A3     20                      80            25                       975
#4      B5      7                      93            17                       983
#5      K7      9                      91            20                       980
#6      L9      0                     100            13                       987

table2 <- table1 %>%
  summarise(case_total_in_gene = sum(Cancer), 
            not_seen_in_gene_cases = 100 - case_total_in_gene, 
            control_total_in_gene = sum(control_total), 
            control_total_not_in_gene = 1000 - control_total_in_gene)

table2
# case_total_in_gene not_seen_in_gene_cases control_total_in_gene control_total_not_in_gene
#1                 36                     64                   117                       883

数据

df <- structure(list(Variant = c("A1", "A2", "A3", "B5", "K7", "L9"
), Cancer = c(0L, 0L, 20L, 7L, 9L, 0L), IBD = c(5L, 8L, 9L, 2L, 
1L, 0L), AKI = c(4L, 5L, 6L, 0L, 8L, 6L), CKD = c(0L, 9L, 7L, 
6L, 4L, 3L), CCF = c(0L, 0L, 0L, 5L, 2L, 3L), IHD = c(4L, 7L, 
3L, 4L, 5L, 1L)), class = "data.frame", row.names = c(NA, -6L))