首页 > 解决方案 > 如何使用 R 制作多个 for 循环以执行不同的功能

问题描述

这是我的极限点,我需要 R 专业人员来帮助我快速循环我的代码。我有一个像这样的df:

GENES <- c('RCD-7','ADF-1','BBF-10','BBF-10','BBF-10','CCF-103')
pos_1 <- c ('T','G','T','A','C','T')
pos_2 <- c ('G','T','A','A','C','G')
df <- data.frame(GENES,pos_1,pos_2)

print(df)

GENES   pos_1 pos_2
RCD-7     T     G
ADF-1     G     T
BBF-10    T     A
BBF-10    A     A
BBF-10    C     C
CCF-103   T     G

我对 df 所做的是,我想计算每个位置(即列)中每个核苷酸(比如说字母表)的百分比,并获得第一列中每个基因的每个位置的最大百分比。通过编写单独的代码行,我已经收到了我想要的输出。但是,我的 df 有超过 200 行和列,所以我想避免一次又一次地为不同的位置粘贴相同的代码。

这是我用来计算和获得所需输出的命令行(我只显示两个位置)。

counts1 <- table(df$GENES, df$pos_1) 
counts2 <- table(df$GENES, df$pos_2)
#
counts_df1 <- as.data.frame(unclass(counts1))
counts_df2 <- as.data.frame(unclass(counts2))
#
ordered_df1 <- tibble::rownames_to_column(counts_df1, "GENES")
ordered_df2 <- tibble::rownames_to_column(counts_df2, "GENES")
#
colnames(ordered_df1) <- c("GENES", "A1", "T1", "C1","G1")
colnames(ordered_df2) <- c("GENES", "A2", "T2", "C2", "G2")
#
ordered_df1[, c(2:4)] <- sapply(ordered_df1[, c(2:4)], as.numeric)
ordered_df2[, c(2:4)] <- sapply(ordered_df2[, c(2:4)], as.numeric)
#
final_df1 <- cbind(ordered_df1[1], prop.table(as.matrix(ordered_df1[-1]), margin = 1)*100)
final_df2 <- cbind(ordered_df2[1], prop.table(as.matrix(ordered_df2[-1]), margin = 1)*100)
#
row_max_df1 <- final_df1 %>% mutate(pos_1_max=pmax(A1, C1, G1, T1))
row_max_df2 <- final_df2 %>% mutate(pos_2_max=pmax(A2, C2, G2, T2))
#
col_combined1 <- cbind (row_max_df1[,c(1,6)],row_max_df2[,6] )

所需的输出应该是:

GENES     pos_1_max        pos_2_max
ADF-1     100.00000        100.00000
BBF-10    33.33333         66.66667
CCF-103   100.00000        100.00000
RCD-7     100.00000        100.00000

我什至无法开始为我的代码的前两行编写循环,所以我非常感谢任何帮助。

标签: rloopsdataframefor-looptidyverse

解决方案


推荐阅读