Как разделить фрейм данных по имени строки в столбце и записать соответствующие выходные данные в файл? - PullRequest
0 голосов
/ 24 января 2019

У меня есть такой фрейм данных:

> e=read.table("SG.genotypes.txt", header=TRUE)
> head(e)
              ID HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
1 snp_3_47609552       0       1       1       1       1       0       1
2 snp_3_47614413       0       1       1       1       1       0       1
3 snp_3_47616151       0       1       1       1       1       0       1
4 snp_2_47616155       0       1       1       1       1       0       1
5 snp_2_47617504       0       1       1       1       1       0       1
6 snp_5_47617679       0       1       1       1       1       0       1
...

Мой фрейм данных имеет гораздо больше имен snp_, но, скажем, как разбить этот пример на 3 выходных файла, например, с именем: chr_2, chr_3, chr_5

где файл chr_3, например, будет иметь только эти строки:

              ID HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
1 snp_3_47609552       0       1       1       1       1       0       1
2 snp_3_47614413       0       1       1       1       1       0       1
3 snp_3_47616151       0       1       1       1       1       0 

Один из способов сделать это - разделить идентификатор столбца по имени строки и создать два столбца, но мне интересно, есть ли лучший способ сделать это.

1 Ответ

0 голосов
/ 24 января 2019

Мы можем подстроковать столбец 'ID' и использовать его для split

lst1 <- split(df1, substr(df1$ID, 1, 5))

Обратите внимание, что если число после 'snp_' больше 9, лучше использовать sub вместо substr

lst1 <- split(df1, sub("^(snp_\\d+)_.*", "\\1", df1$ID))
names(lst1) <- sub("snp", "chr", names(lst1))
lst1
#$chr_2
#              ID HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
#4 snp_2_47616155       0       1       1       1       1       0       1
#5 snp_2_47617504       0       1       1       1       1       0       1

#$chr_3
#              ID HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
#1 snp_3_47609552       0       1       1       1       1       0       1
#2 snp_3_47614413       0       1       1       1       1       0       1
#3 snp_3_47616151       0       1       1       1       1       0       1

#$chr_5
#              ID HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
#6 snp_5_47617679       0       1       1       1       1       0       1

Пролистать names из list и записать его в .csv файл

lapply(names(lst1), function(nm) write.csv(lst[[nm]], 
       file = paste0(nm, ".csv"), quote = FALSE, row.names = FALSE))

данные

df1 <- structure(list(ID = c("snp_3_47609552", "snp_3_47614413", "snp_3_47616151", 
 "snp_2_47616155", "snp_2_47617504", "snp_5_47617679"), HG00096 = c(0L, 
 0L, 0L, 0L, 0L, 0L), HG00097 = c(1L, 1L, 1L, 1L, 1L, 1L), HG00099 = c(1L, 
 1L, 1L, 1L, 1L, 1L), HG00100 = c(1L, 1L, 1L, 1L, 1L, 1L), HG00101 = c(1L, 
  1L, 1L, 1L, 1L, 1L), HG00102 = c(0L, 0L, 0L, 0L, 0L, 0L), HG00103 = c(1L, 
  1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...