如何在R中使用for循环将列保存到单个文件中

如何在R中使用for循环将列保存到单个文件中,r,for-loop,apply,R,For Loop,Apply,我有一个包含143列和147153行的数据框,如下所示:(我的数据子集) 现在,我需要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

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

现在,我需要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)
}
但我得到的错误如下:


$中的错误我们可以将
lappy
fwrite
一起使用。根据显示的数据,似乎是
数据。表

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"))})
数据
log\u trans2我不确定您试图合并的数据帧是什么。
如果您的数据帧是
df
,并且希望一次隔离并保存一列,则可以执行以下操作:

for(3中的i:ncol(df))
{
temp_df=df[,c(1,2,i)]
write.table(temp_df,filename=paste0(“患者”,i,“.txt”),sep=“\t”,row.names=FALSE)
}

最大的错误是不能将变量与
$
一起使用。变量仅适用于
[
。您还需要注意
患者[,1]
是您的第一列,但
患者[,“1”]
是您的第三列…使用编号的列名通常是一个坏主意。谢谢。我将列名更改为patient_1。patient_2等。不清楚您试图对这些合并调用执行什么操作。OTUId是什么?最好将问题集中在一项任务上,也许这项任务是关于写入文件的,然后进入下一项任务根据需要询问我还有一个包含两列(OTUId和OTUNames)的文件.OTUid的内容与otu1和otu2的内容相同。因此,我还需要获取OTUNames。如果您需要我们帮助您处理更多数据,您需要将其添加到问题中。很抱歉。我认为有一个错误brackets@MSM很抱歉,在
函数(nm)后面有一个拼写错误,
。我重新移动了。我真的很抱歉。我没有收到任何通知output@MSM我以为你的数据集是数据。从显示的输入中可以看到表。那是data.frame还是data.table?如果它只是一个data.frame,请删除
with=FALSE
是的。它工作正常。我得到了所需的输出。非常感谢
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"))})
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:"))