【问题标题】:how to save multiple files with selected columns using lappy in r如何在 r 中使用 lappy 保存具有选定列的多个文件
【发布时间】:2020-02-26 09:42:46
【问题描述】:

我有一个包含 98790 行和 284 列的数据框

 otu1    otu2     35-T80-FDA.x  35-T80-FDA.y  33-T26-FDA.x   33-T26-FDA.y
1: OTU_1  OTU_10  3.807355      5.403722     3.972693        3.787
2: OTU_1 OTU_100 -1.618910      0.000000     0.000000        5.687
3: OTU_1 OTU_101  0.000000      0.000000     0.000000        4.9898

我有成对的列名。

35-T80-FDA.x 和 35-T80-FDA.y

33-T26-FDA.x 和 33-T26-FDA.y 等等

所以在输出中,我需要 1 列和 2 列以及随后的成对列在单独的文件中。期望的输出将是:

文件1:

otu1    otu2     33-T26-FDA.x  33-T26-FDA.y  
1: OTU_1  OTU_10  3.807355      5.403722            
2: OTU_1 OTU_100 -1.618910      0.000000             
3: OTU_1 OTU_101  0.000000      0.000000

文件2:

otu1    otu2     35-T80-FDA.x  35-T80-FDA.y  
1: OTU_1  OTU_10  3.807355      5.403722            
2: OTU_1 OTU_100 -1.618910      0.000000             
3: OTU_1 OTU_101  0.000000      0.000000

我尝试如下使用 lapply 函数,但不知道如何获取输出文件中的配对列

lapply(names(res_merge_2)[1:281],function(nm) {
  d1 <- res_merge_2[, c(names(res_merge_2)[1:2], nm)]
   colnames(d1)[5]="nlr"
  fwrite(d1,  file = paste0("",nm, ".csv"))})
str(res_merge)
res_merge_2

请帮帮我

【问题讨论】:

    标签: r apply lapply


    【解决方案1】:

    您可以根据名称中的通用模式使用split.default,将每个部分绑定到前两列并使用fwrite写入数据。

    library(data.table)
    
    df1 <- df[,-c(1:2)]
    
    lapply(split.default(df1, sub("\\..*", "", names(df1))), function(x) 
          fwrite(cbind(df[,1:2],x), paste0(sub("\\..*", "", names(x[,1])), ".csv")))
    

    【讨论】:

    • 我没有得到任何保存的文件。为什么会这样
    • @MSM 对不起,一个小错字。更新了答案,现在可以查吗?
    • 我没有收到任何错误。但是文件夹中没有保存输出文件。格式是数据框。有什么问题吗?
    • 它对我有用。请检查您的工作目录中的文件,这些文件可以通过getwd() 找到
    • 我将数据框更改为数据表。它现在工作了
    【解决方案2】:

    您也可以在基础 R 中通过提示配对列(以及您希望在所有输出文件中回收的两列)名称中的唯一块来执行此操作。因此,在这里,您使用 grepgsubres_merge_2 的列名中创建这些唯一树桩的向量,然后在其上迭代一个简单的列选择和 csv 写入函数。

    lapply(unique(gsub("-FDA.*", "", grep("-FDA.*", names(res_merge_2), value = TRUE))), function(x) {
    
        write.csv(res_merge_2[,c(grep("otu", names(res_merge_2), value = TRUE), grep(x, names(res_merge_2), value = TRUE))],
                  sprintf("%s.csv", x))
    
    })
    

    不过,这不是一个使用for 循环的好地方,例如:

    for (x in unique(gsub("-FDA.*", "", grep("-FDA.*", names(res_merge_2), value = TRUE)))) {
    
        write.csv(res_merge_2[,c(grep("otu", names(res_merge_2), value = TRUE), grep(x, names(res_merge_2), value = TRUE))],
                  sprintf("%s.csv", x))
    
    }
    

    这两个数据集都对我有用:

    res_merge_2 <- structure(list(otu1 = c("dog", "dog", "dog", "dog", "dog", "dog", 
    "dog", "dog", "dog", "dog"), otu2 = c("cat", "cat", "cat", "cat", 
    "cat", "cat", "cat", "cat", "cat", "cat"), `X32-T26-FDA.x` = c("a", 
    "b", "c", "d", "e", "f", "g", "h", "i", "j"), `X32-T26-FDA.y` = c("A", 
    "B", "C", "D", "E", "F", "G", "H", "I", "J"), `X15-X3Q-FDA.x` = c(-0.0391614774317114, 
    -0.749042584495182, -1.35322520345808, -0.542635541523875, 0.554157309246222, 
    -0.022582818348649, -1.02251842826834, 1.30695316220872, 0.733483858951273, 
    0.495620995563405), `X15-X3Q-FDA.y` = c(0.097683395164639, -1.31072727972662, 
    -0.324722669182535, -0.194820429986227, 1.13036969830475, -0.376850316761238, 
    -1.89704006462136, -0.11021797586389, -0.243968444535775, 1.12909359192043
    )), class = "data.frame", row.names = c(NA, -10L))
    

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2015-11-19
      • 2020-05-16
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多