【问题标题】:R: Extracting lines from dataframes in list and splitting into new dataframesR:从列表中的数据框中提取行并拆分为新的数据框
【发布时间】:2015-03-09 00:10:48
【问题描述】:

我有一个包含 3 个数据框 (DvE, DvS, EvS) 的列表:

str(Table.list2)
List of 3
 $ DvE:'data.frame':    18482 obs. of  4 variables:
  ..$ gene      : Factor w/ 18482 levels "c10000_g1_i3|m.32237",..: 1 2 3 4 5 6 7 8 9 10 ...
  ..$ FDR       : num [1:18482] 0.502 0.982 0.936 0.411 0.461 ...
  ..$ log2FC    : num [1:18482] 0.415 -0.245 0.728 -0.384 0.474 ...
  ..$ annotation: Factor w/ 4939 levels "","[Genbank](myosin heavy-chain) kinase [Calothrix sp. PCC 6303] ",..: 1 2204 2980 2204 1 2204 4622 2980 1 241 ...
 $ DvS:'data.frame':    18482 obs. of  4 variables:
  ..$ gene      : Factor w/ 18482 levels "c10000_g1_i3|m.32237",..: 1 2 3 4 5 6 7 8 9 10 ...
  ..$ FDR       : num [1:18482] 1.25e-01 7.18e-01 2.02e-01 2.72e-13 6.02e-01 ...
  ..$ log2FC    : num [1:18482] -0.417 0.583 2.148 1.689 -0.167 ...
  ..$ annotation: Factor w/ 4939 levels "","[Genbank](myosin heavy-chain) kinase [Calothrix sp. PCC 6303] ",..: 1 2204 2980 2204 1 2204 4622 2980 1 241 ...
 $ EvS:'data.frame':    18482 obs. of  4 variables:
  ..$ gene      : Factor w/ 18482 levels "c10000_g1_i3|m.32237",..: 1 2 3 4 5 6 7 8 9 10 ...
  ..$ FDR       : num [1:18482] 1.78e-03 6.04e-01 4.09e-01 3.42e-19 3.20e-02 ...
  ..$ log2FC    : num [1:18482] -0.832 0.828 1.42 2.073 -0.641 ...
  ..$ annotation: Factor w/ 4939 levels "","[Genbank](myosin heavy-chain) kinase [Calothrix sp. PCC 6303] ",..: 1 2204 2980 2204 1 2204 4622 2980 1 241 ...

所有 3 个数据帧都具有相似的结构,例如:

> head(Table.list2$DvE)
                  gene       FDR     log2FC                               annotation
1 c10000_g1_i3|m.32237 0.5024600  0.4149066                                         
2 c10000_g1_i4|m.32240 0.9818297 -0.2449509 [Pfam]Calcium-activated chloride channel
3 c10000_g1_i4|m.32242 0.9361868  0.7277203                         [Pfam]LSM domain
4 c10000_g1_i5|m.32244 0.4114795 -0.3835745 [Pfam]Calcium-activated chloride channel
5 c10000_g1_i6|m.32245 0.4605157  0.4739777                                         
6 c10000_g1_i6|m.32246 0.4965353 -0.4607749 [Pfam]Calcium-activated chloride channel

我想做的是在每个数据框中,取出有FDR < 0.05log2FC > 0的数据放入一个新的数据框,然后取出有FDR < 0.05log2FC < 0的数据并放入另一个数据框。

所以从 3 个数据框的列表中,我会得到 6 个新的数据框,这些数据框被命名为:

DvE.+

DvE.-

DvS.+

DvS.-

EvS.+

EvS.-

DvE.+ 的示例输出:

                    gene          FDR    log2FC                                                                   annotation
47  c10010_g1_i4|m.32346 8.609296e-15 1.9188013                  [Genbank]conserved unknown protein [Ectocarpus siliculosus]
48  c10010_g1_i4|m.32348 5.625766e-09 1.8240089           [Genbank]hypothetical protein THAOC_07134 [Thalassiosira oceanica]
155 c10037_g1_i4|m.32582 2.666894e-02 0.6669399                                                     [Pfam]LETM1-like protein
211 c10050_g2_i2|m.32706 8.154555e-03 1.6900611 [Genbank]hypothetical protein SELMODRAFT_84252 [Selaginella moellendorffii] 
243 c10057_g1_i1|m.32812 1.936893e-02 0.8141790                                     [Pfam]Fibrinogen alpha/beta chain family
265 c10061_g4_i2|m.32861 3.614401e-02 1.7059034                                                         [Pfam]Maf1 regulator

我想知道是否有一种更优雅的方式/循环可以让我完成所有这些操作,而不是重复写出类似的命令行?

更新:

我试过这样做:

DEG.list <- lapply(Table.list2, function(i){
    pos <- i[(i$FDR < 0.05 & i$log2FC > 0),]    
    neg <- i[(i$FDR < 0.05 & i$log2FC < 0),]    
    assign(paste(i, ".+", sep=""), value=pos)
    assign(paste(i, ".-", sep=""), value=neg)
})

但是我收到了这个错误:

警告信息:
1:在分配(粘贴(i,“。+”,sep =“”),值= pos): 只有第一个元素用作变量名 2:在assign(paste(i, ".-", sep = ""), value = neg) 中: 只有第一个元素用作变量名 3:在分配(粘贴(i,“。+”,sep =“”),值= pos): 只有第一个元素用作变量名 4:在assign(paste(i, ".-", sep = ""), value = neg) 中: 只有第一个元素用作变量名 5:在分配(粘贴(i,“。+”,sep =“”),值= pos): 只有第一个元素用作变量名 6:在assign(paste(i, ".-", sep = ""), value = neg) 中: 只有第一个元素用作变量名

【问题讨论】:

  • 您收到错误消息是因为在您的lapply 中,变量i 是数据框(而不是数据框的名称)。因此,在您的分配中,您试图将数据框粘贴到字符串中。这就是错误的来源。试试这个:DEG.list &lt;- lapply(names(Table.list2), function(i){ pos &lt;- Table.list2[[i]][(Table.list2[[i]]$FDR &lt; 0.05 &amp; Table.list2[[i]]$log2FC &gt; 0),] neg &lt;- Table.list2[[i]][(Table.list2[[i]]$FDR &lt; 0.05 &amp; Table.list2[[i]]$log2FC &lt; 0),] assign(paste(i, ".+", sep=""), value=pos) assign(paste(i, ".-", sep=""), value=neg) })

标签: r list dataframe


【解决方案1】:
   Not tested: 
   listdf<-list(DvE, DvS, EvS)
   library(dplyr) # filtering the data
  alldf<-lapply(listdf, function(i) { # Each list contains two filtered dataframes
    df1<-filter(i,FDR < 0.05 & log2FC > 0) # dfs have not been properly named here 
    df2<-filter(i,FDR < 0.05 & log2FC < 0)
    list(df1,df2)
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 2022-01-12
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多