Как сохранить несколько файлов с выбранными столбцами, используя Lappy в г - PullRequest
1 голос
/ 26 февраля 2020

У меня есть фрейм данных с 98790 строками и 284 столбцами

 otu1    otu2     35-T80-FDA.x  35-T80-FDA.y  33-T26-FDA.x   33-T26-FDA.y
1: OTU_1  OTU_10  3.807355      5.403722     3.972693        3.787
2: OTU_1 OTU_100 -1.618910      0.000000     0.000000        5.687
3: OTU_1 OTU_101  0.000000      0.000000     0.000000        4.9898

У меня есть парные имена столбцов.

35-T80-FDA.x и 35-T80-FDA .y

33-T26-FDA.x и 33-T26-FDA.y и т. д.

Итак, в выводе мне нужны 1 и 2 столбца и последующие парные столбцы в отдельных файлах. желаемый результат будет:

file1:

otu1    otu2     33-T26-FDA.x  33-T26-FDA.y  
1: OTU_1  OTU_10  3.807355      5.403722            
2: OTU_1 OTU_100 -1.618910      0.000000             
3: OTU_1 OTU_101  0.000000      0.000000

file2:

otu1    otu2     35-T80-FDA.x  35-T80-FDA.y  
1: OTU_1  OTU_10  3.807355      5.403722            
2: OTU_1 OTU_100 -1.618910      0.000000             
3: OTU_1 OTU_101  0.000000      0.000000

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

lapply(names(res_merge_2)[1:281],function(nm) {
  d1 <- res_merge_2[, c(names(res_merge_2)[1:2], nm)]
   colnames(d1)[5]="nlr"
  fwrite(d1,  file = paste0("",nm, ".csv"))})
str(res_merge)
res_merge_2

любезно помогите мне

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вы можете использовать split.default на основе общего шаблона в именах, привязать каждую часть к первым двум столбцам и использовать fwrite для записи данных.

library(data.table)

df1 <- df[,-c(1:2)]

lapply(split.default(df1, sub("\\..*", "", names(df1))), function(x) 
      fwrite(cbind(df[,1:2],x), paste0(sub("\\..*", "", names(x[,1])), ".csv")))
0 голосов
/ 26 февраля 2020

Вы также можете сделать это в базе R, отключив уникальные куски в именах парных столбцов (и двух столбцов, которые вы хотите перезаписать во всех выходных файлах). Итак, здесь вы используете grep и gsub для создания вектора этих уникальных пней из имен столбцов res_merge_2, а затем выполняете над ним простую функцию выбора столбца и записи csv.

lapply(unique(gsub("-FDA.*", "", grep("-FDA.*", names(res_merge_2), value = TRUE))), function(x) {

    write.csv(res_merge_2[,c(grep("otu", names(res_merge_2), value = TRUE), grep(x, names(res_merge_2), value = TRUE))],
              sprintf("%s.csv", x))

})

Это неплохое место для использования for l oop, однако, например:

for (x in unique(gsub("-FDA.*", "", grep("-FDA.*", names(res_merge_2), value = TRUE)))) {

    write.csv(res_merge_2[,c(grep("otu", names(res_merge_2), value = TRUE), grep(x, names(res_merge_2), value = TRUE))],
              sprintf("%s.csv", x))

}

Оба из них работали для меня с этим набором игрушечных данных:

res_merge_2 <- structure(list(otu1 = c("dog", "dog", "dog", "dog", "dog", "dog", 
"dog", "dog", "dog", "dog"), otu2 = c("cat", "cat", "cat", "cat", 
"cat", "cat", "cat", "cat", "cat", "cat"), `X32-T26-FDA.x` = c("a", 
"b", "c", "d", "e", "f", "g", "h", "i", "j"), `X32-T26-FDA.y` = c("A", 
"B", "C", "D", "E", "F", "G", "H", "I", "J"), `X15-X3Q-FDA.x` = c(-0.0391614774317114, 
-0.749042584495182, -1.35322520345808, -0.542635541523875, 0.554157309246222, 
-0.022582818348649, -1.02251842826834, 1.30695316220872, 0.733483858951273, 
0.495620995563405), `X15-X3Q-FDA.y` = c(0.097683395164639, -1.31072727972662, 
-0.324722669182535, -0.194820429986227, 1.13036969830475, -0.376850316761238, 
-1.89704006462136, -0.11021797586389, -0.243968444535775, 1.12909359192043
)), class = "data.frame", row.names = c(NA, -10L))
...