我有一个非常大的数据帧,在行中(约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)
不幸的是,它没有用...
谢谢!
答案 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文件。