R:将带有制表符的txt保存为行标题

时间:2019-10-10 13:17:41

标签: r dataframe export write.table

我有一个非常大的数据帧,在行中(约50.000)有SNP,在列中有ID(约500),想象提取看起来像这样:

      R015 R016 R007
cg158 0.81 0.90 0.87
cg178 0.91 0.80 0.58

现在,我要将其另存为txt,通常不会出现问题 write.table(example, "example.txt", colnames=T, rownames=T, quotes=F) 但是我需要有一个标签(\ t)作为第一列入口,所以在txt文件中,数据框看起来应该像这样:

 \t   R015 R016 R007
cg158 0.81 0.90 0.87
cg178 0.91 0.80 0.58

(用于标签的\ t)

有人可以帮我怎么做吗? 顺便说一句,我也尝试过: write.table(data.frame("\t"=rownames(example),example),"example.txt", row.names=FALSE) 不幸的是,它没有用...

谢谢!

2 个答案:

答案 0 :(得分:1)

这种工作方式,只需将stdout()替换为输出文件的路径即可:

data <- data.frame(x = sample(1:100,3), 
                   y = sample(1:100,3), 
                   z = sample(1:100,3))
row.names(data) <- LETTERS[1:3]
lines <- c(paste(c(' ', names(data)), collapse = '\t'),
           sapply(seq_len(nrow(data)),
       function(i){
         paste(c(row.names(data)[i], data[i,]),collapse = '\t')
       }))
writeLines(lines, con = stdout())
#>      x   y   z
#> A    35  97  27
#> B    12  69  24
#> C    25  9   34

或在第一列中使用空格作为分隔符和所需的标签:

data <- data.frame(x = sample(1:100,3), 
                   y = sample(1:100,3), 
                   z = sample(1:100,3))
row.names(data) <- LETTERS[1:3]
lines <- c(paste(c('\t', names(data)), collapse = ' '),
           sapply(seq_len(nrow(data)),
       function(i){
         paste(c(row.names(data)[i], data[i,]),collapse = ' ')
       }))
writeLines(lines, con = stdout())
#>   x y z
#> A 3 30 11
#> B 62 69 70
#> C 93 55 73

答案 1 :(得分:1)

使用如下所示的数据框,其中我更改了一个行名以说明如何处理长度不等的情况:

df <- read.table(text = "R015 R016 R007
cg158 0.81 0.90 0.87
cg178kdfj 0.91 0.80 0.58")

您可以执行以下操作:

df <- format(as.matrix(df))
df <- cbind("\\t" = rownames(df), df)
df <- rbind(colnames(df), df)
df[,1] <- stringr::str_pad(df[,1], max(nchar(df[,1])), "right")
write.table(df,
            file = "example.txt",
            sep = " ",
            quote = F,
            row.names = F,
            col.names = F)

输出:

\t        R015 R016 R007
cg158     0.81 0.90 0.87
cg178kdfj 0.91 0.80 0.58

我首先将数字值转换为字符,然后format对它们进行设置,以确保它们具有相同的数字位数,否则它们将不会对齐。然后,将行名称转换为名为\\t的新变量,然后将列名称转换为新行。我使用stringr::str_pad()来解释长度不同的行名。最后,我将没有行名或列名的数据帧写入TXT文件。