【问题标题】:How to save columns into individual files using for loop in R如何使用R中的for循环将列保存到单个文件中
【发布时间】:2020-03-29 10:23:04
【问题描述】:

我有一个包含 143 列和 147153 行的数据框,如下所示:(我的数据的子集)

    otu1    otu2         1        2        3
1: OTU_1  OTU_10  3.807355 5.403722 3.972693
2: OTU_1 OTU_100 -1.618910 0.000000 0.000000
3: OTU_1 OTU_101  0.000000 0.000000 0.000000

现在我需要 1 列和 2 列以及后续列在单独的文件中。 期望的输出将是:

文件 1:

      otu1     otu2         1
 1:   OTU_1   OTU_10  3.807355
 2:   OTU_1  OTU_100 -1.618910
 3:   OTU_1  OTU_101  0.000000
 4:   OTU_1 OTU_1019  0.000000
 5:   OTU_1  OTU_102  0.000000

文件 2 等等....

      otu1     otu2        2
 1:   OTU_1   OTU_10 5.403722
 2:   OTU_1  OTU_100 0.000000
 3:   OTU_1  OTU_101 0.000000
 4:   OTU_1 OTU_1019 9.211077
 5:   OTU_1  OTU_102 0.000000

所以,我尝试了以下代码:

for ( i in 1:141){
  patient$i=log_trans2[,c(1:2,(i+2))]
  patient$i=patient$i[patient$i!=0]
  patient$i=merge(patient$i, OTUNames, by.x="otu2", by.y="OTUId")
  patient$i=merge(patient$i, OTUNames, by.x="otu1", by.y="OTUId")
  write.table(patient1$i, file=sprintf("patient_grahs/patient.%s.tab",i), sep = '\t',quote = FALSE)
}

但我收到如下错误:

$<-.data.frame(*tmp*, "i", value = c(1, 2, 4)) 中的错误: 替换有3行,数据有0

我哪里出错了?

【问题讨论】:

  • 您最大的错误是不能将变量与$ 一起使用。变量仅适用于 [。您还需要注意patient[, 1] 是您的第一列,而patient[, "1"] 是您的第三列...使用编号的列名通常是个坏主意。
  • 谢谢。我将列名更改为 Patient_1。 patient_2 等
  • 目前还不清楚您要对这些合并调用做什么。什么是 OTUId?最好让你的问题集中在一个任务上——也许这个问题是关于写出文件,然后根据需要进入下一个任务
  • 我还有一个包含两列(OTUId 和 OTUNames)的文件。 OTUid 与 otu1 和 otu2 具有相同的内容。所以我也需要获取 OTUNames
  • 如果您需要我们帮助您处理的更多数据,您需要将其添加到问题中

标签: r for-loop apply


【解决方案1】:

我们可以使用lapplyfwrite。根据显示的数据,似乎是data.table

library(data.table)
setDT(log_trans2)
lapply(names(log_trans2)[3:ncol(log_trans2)], function(nm) {
     d1 <- log_trans2[, c(names(log_trans2)[1:2], nm), with = FALSE]
     d1 <- merge(d1, OTUNames, by.x="otu2", by.y="OTUId")
     d1 <- merge(d1, OTUNames, by.x="otu1", by.y="OTUId")
   fwrite(d1,  file = paste0("patients_", nm, ".txt"))})

fwrite 的输入是

lapply(names(log_trans2)[3:ncol(log_trans2)], function(nm) 
     log_trans2[, c(names(log_trans2)[1:2], nm), with = FALSE])
#[[1]]
#    otu1    otu2         1
#1: OTU_1  OTU_10  3.807355
#2: OTU_1 OTU_100 -1.618910
#3: OTU_1 OTU_101  0.000000

#[[2]]
#    otu1    otu2        2
#1: OTU_1  OTU_10 5.403722
#2: OTU_1 OTU_100 0.000000
#3: OTU_1 OTU_101 0.000000

#[[3]]
#    otu1    otu2        3
#1: OTU_1  OTU_10 3.972693
#2: OTU_1 OTU_100 0.000000
#3: OTU_1 OTU_101 0.000000

数据

log_trans2 <- structure(list(otu1 = c("OTU_1", "OTU_1", "OTU_1"), otu2 = c("OTU_10", 
"OTU_100", "OTU_101"), `1` = c(3.807355, -1.61891, 0), `2` = c(5.403722, 
0, 0), `3` = c(3.972693, 0, 0)), class = "data.frame", row.names = c("1:", 
"2:", "3:"))

【讨论】:

  • 对不起。我认为有一个放错位置的括号
  • @MSM 抱歉,,function(nm) 之后有错字。我删除了它
  • 真的很抱歉。我没有得到任何输出
  • @MSM 我认为您的数据集是来自输入显示的data.table。那是data.frame还是data.table?如果只是一个data.frame,去掉with = FALSE
  • 是的。它工作正常。我得到了欲望输出。非常感谢
【解决方案2】:

我不确定您要合并数据框的内容。 如果您的数据框是 df 并且您想一次隔离并保存一列,您可以这样做:

for(i in 3:ncol(df))
{
   temp_df = df[,c(1,2,i)]
   write.table(temp_df, filename = paste0("patients_",i,".txt"), sep = "\t", row.names = FALSE)
}

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多