Как объединить несколько файлов в R в очень конкретном формате c? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть 5 CSV-файлов, которые имеют такие данные:

Файл 1:

 - rsid  chr pos a1 a0 beta  se   pvalue nsample 
 - rs1234 1  123 A  C  0.985 0.12 1e-5   1276
 - rs4567 2  234 T  G  0.276 0.34 1e-2   3847
 - rs8910 3  345 C  T  0.847 0.29 2e-6   3949

Файл 2:

- rsid   chr pos a1 a0 beta   se   pvalue nsample
- rs1234 1   123 A  C  0.598  0.93 1e-3   3949
- rs8910 3   345 C  T  0.3039 0.29 1e-3   0392

Файл 3:

- rsid   chr pos a1 a0 beta  se   pvalue nsample
- rs1234 1   123 A  C  3.094 1.29 1e-2   0303
- rs4567 2   234 T  G  2.101 2.09 1e-2   9922
- rs8910 3   345 C  T  0.229 1.09 2e-3   9329

Аналогично файлы 4 и 5.

Я хочу, чтобы они были объединены следующим образом: (Заголовки должны быть удалены)

- rs1234 1 123 A C
- 0.985 0.12 1e-5 1276             (from file 1)
- 0.598 0.93 1e-3 3949             (from file 2)
- 3.094 1.29 1e-2 0303             (from file 3)
- rs4567 2 234 T G
- 0.276 0.34 1e-2 3847            (from file 1)
- 0 0 0 0 0                       (from file 2)
- 2.101 2.09 1e-2 9922            (from file 3)
- rs8910 3 345 C T
- 0.847 0.29 2e-6 3949             (from file 1)
- 0.3039 0.29 1e-3 0392            (from file 2)
- 0.229 1.09 2e-3 9329             (from file 3)

Для каждого rsid первые пять столбцов одинаковы в каждом файле (т.е. rsid, chr, pos, a1, a0). Они становятся первой линией. Остальные столбцы имеют разные детали. Они располагаются один под другим в том же порядке, что и файл1, файл2 и файл3. Если определенный rsid не найден ни в одном файле, то должны быть нули (0,0,0,0,0).

Слово в скобках (из файла1, из файла2 и из файла3) предназначено для понимания. Их не нужно включать в объединенный файл.

1 Ответ

0 голосов
/ 15 апреля 2020

Имена разных столбцов немного странные, но все же могут обойти их.

library(data.table)
dt1 <- fread('rsid chr pos a1 a0 beta se pvalue nsample
rs1234 1 123 A C 3.094 1.29 1e-2 0303
rs4567 2 234 T G 2.101 2.09 1e-2 9922
rs8910 3 345 C T 0.229 1.09 2e-3 9329')
dt2 <- fread('rsid chr pos a1 a0 beta se pvalue nsample
rs1234 1 123 A C 0.598 0.93 1e-3 3949
rs8910 3 345 C T 0.3039 0.29 1e-3 0392')
dt3 <- fread('rsid chr pos a1 a0 beta se pvalue nsample
rs1234 1 123 A C 3.094 1.29 1e-2 0303
rs4567 2 234 T G 2.101 2.09 1e-2 9922
rs8910 3 345 C T 0.229 1.09 2e-3 9329')

dt1[,id:=1]
dt2[,id:=2]
dt3[,id:=3]

dt <- rbindlist(list(dt1,dt2,dt3))

RSID <- unique(dt$rsid)
ID <- unique(dt$id)

dtt <- dt[CJ(RSID,ID),on=.(rsid=RSID,id=ID)]
dtt[is.na(dtt)] <- 0

names(dtt) <- c("rsid", "chr", "pos", "a1", "a0", "rsid", "chr", "pos", "a1","id") # work around to fix names issue, which is onlu suitable for OP's question


extract_rsid <- function(x){
  rbindlist(list(dtt[rsid==x,.SD[1,1:5]],
                 dtt[rsid==x,6:9]),fill = TRUE)
}


l <- lapply(RSID,extract_rsid)


rbindlist(l)
#>       rsid  chr     pos   a1   a0
#>  1: rs1234 1.00 123.000    A    C
#>  2:  3.094 1.29   0.010  303 <NA>
#>  3:  0.598 0.93   0.001 3949 <NA>
#>  4:  3.094 1.29   0.010  303 <NA>
#>  5: rs4567 2.00 234.000    T    G
#>  6:  2.101 2.09   0.010 9922 <NA>
#>  7:      0 0.00   0.000    0 <NA>
#>  8:  2.101 2.09   0.010 9922 <NA>
#>  9: rs8910 3.00 345.000    C    T
#> 10:  0.229 1.09   0.002 9329 <NA>
#> 11: 0.3039 0.29   0.001  392 <NA>
#> 12:  0.229 1.09   0.002 9329 <NA>

Создано в 2020-04-15 пакетом представлением (v0 .3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...