我提前道歉,我的问题标题可能没有准确描述我想要做什么。我认为我需要创建的是一个循环,但我会给出更多细节。我有两个数据框
df1
chr location gene sample1 sample2
1 12345 FAM1 0.1 0
1 124353 ABCA 1 0.5
2 12353 ALMS1 2 0.1
3 23456 TNN 0 0
7 657864 MYBC3 0.3 1
和 df2
sucrose fructose glucose galactose
FAM1 FAM2 ALMS1 ALMS2
FAM2 TNN2 MYBC3 ABCA
FAM3 MYBC2 TNN ABCA2
FAM4 MYBC ABCA2 FAM3
FAM5 ALMS2 ABCA3 FAM4
所以 df1 是我的主要数据框,df2 包含我用来过滤 df1 的列。例如,我将使用 df2(蔗糖)的第一列并过滤 df1 用于蔗糖列中的任何基因。因此,在应用过滤器后,数据将如下所示。
chr location gene sample1 sample2
1 12345 FAM1 0.1 0
所以我已经能够做到这一点,但真正的 df2 有数千列。所以我想做的是一些如何创建循环?(如果这是正确的术语)将贯穿 df2 中的所有列,将它们作为过滤器应用于 df1,然后将结果另存为新数据框。理想情况下,我希望新数据框与过滤它的列具有相同的名称,因此在我给出的新数据框的示例中,它看起来像这样
sucrose
# chr location gene sample1 sample2
# 1 1 12345 FAM1 0.1 0
这是我只为 df2 中的一列运行的脚本示例
sucrose <- df1 %>%
filter(gene %in% df2[[1]]) %>%
filter(gene != "")
sucrose$Number.of.MMVD.dogs <- (sucrose$sample1 + sucrose$sample2)
sucrose <- sucrose %>%
filter(Number.of.MMVD.dogs >= 0.01)
这个过滤器给了我以下输出
sucrose
# chr location gene sample1 sample2 Number.of.MMVD.dogs
# 1 1 12345 FAM1 0.1 0 0.1
我只是不想为我用来过滤 df1 的每一列都输入这个。我知道有更好的方法来做到这一点而不是手工完成,但我不确定如何做到这一点。我承认,它会创建很多数据框,但我会为一个项目保存它们。
考虑将宽df2重塑为长格式,tidyr::gather
然后dplyr::inner_join
与df1一起使用。最后,split
新糖列的数据框返回一个包含许多数据框的列表,理想情况下,它比充斥全球环境的 1,000 个数据框更易于管理:
longdf <- df2 %>%
tidyr::gather(sugar, gene)
df1 <- df1 %>%
dplyr::inner_join(longdf, by="gene")
df_list <- split(df1, df1$sugar)
# LIST OF THREE DATA FRAMES
df_list
# $galactose
# chr location gene sample1 sample2 sugar
# 2 1 124353 ABCA 1 0.5 galactose
# $glucose
# chr location gene sample1 sample2 sugar
# 3 2 12353 ALMS1 2.0 0.1 glucose
# 4 3 23456 TNN 0.0 0.0 glucose
# 5 7 657864 MYBC3 0.3 1.0 glucose
# $sucrose
# chr location gene sample1 sample2 sugar
# 1 1 12345 FAM1 0.1 0 sucrose
如果将数据框存储在命名列表中而不是作为单独的对象,则不会失去数据框的功能:
summary(df_list$galactose)
# chr location gene sample1 sample2 sugar
# Min. :1 Min. :124353 Length:1 Min. :1 Min. :0.5 Length:1
# 1st Qu.:1 1st Qu.:124353 Class :character 1st Qu.:1 1st Qu.:0.5 Class :character
# Median :1 Median :124353 Mode :character Median :1 Median :0.5 Mode :character
# Mean :1 Mean :124353 Mean :1 Mean :0.5
# 3rd Qu.:1 3rd Qu.:124353 3rd Qu.:1 3rd Qu.:0.5
# Max. :1 Max. :124353 Max. :1 Max. :0.5
str(df_list$glucose)
# 'data.frame': 3 obs. of 6 variables:
# $ chr : int 2 3 7
# $ location: int 12353 23456 657864
# $ gene : chr "ALMS1" "TNN" "MYBC3"
# $ sample1 : num 2 0 0.3
# $ sample2 : num 0.1 0 1
# $ sugar : chr "glucose" "glucose" "glucose"
head(df_list$sucrose)
# chr location gene sample1 sample2 sugar
# 1 1 12345 FAM1 0.1 0 sucrose
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句