R: сохранить текст с вкладкой в ​​качестве заголовка строк - PullRequest
0 голосов
/ 10 октября 2019

У меня очень большой фрейм данных с SNP в строках (~ 50.000) и идентификаторами в столбцах (~ 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 ]

1 голос
/ 10 октября 2019

Используя фрейм данных, подобный следующему, где я изменил имя одной строки, чтобы проиллюстрировать, как обращаться со случаями неравной длины:

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 без имен строк или столбцов.

1 голос
/ 10 октября 2019

Этот тип работ, просто замените 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
...