Мы можем подстроковать столбец '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"))