2

read.table を使用してこの問題に遭遇したのはこれが初めてです。非常に多数の列を持つ行エントリの場合、read.table は列エントリを次の行にループします。

可変長で不等長の行を含む .txt ファイルがあります。参考までに、これは私が読んでいる.txtファイルです

これが私のコードです:

tabsep <- gsub("\\\\t", "\t", "\\t")
MSigDB.collection = read.table(fileName, header = FALSE, fill = TRUE, as.is = TRUE, sep = tabsep)

部分的な出力: 最初の列

                                 V1                                                                               V2     V3     V4      V5      V6
1                   TRNA_PROCESSING                  http://www.broadinstitute.org/gsea/msigdb/cards/TRNA_PROCESSING  ADAT1  TRNT1   FARS2
2  REGULATION_OF_BIOLOGICAL_QUALITY http://www.broadinstitute.org/gsea/msigdb/cards/REGULATION_OF_BIOLOGICAL_QUALITY   DLC1   ALS2  SLC9A7
3             DNA_METABOLIC_PROCESS            http://www.broadinstitute.org/gsea/msigdb/cards/DNA_METABOLIC_PROCESS  XRCC5  XRCC4  RAD51C
4     AMINO_SUGAR_METABOLIC_PROCESS    http://www.broadinstitute.org/gsea/msigdb/cards/AMINO_SUGAR_METABOLIC_PROCESS   UAP1   CHIA  GNPDA1
5      BIOPOLYMER_CATABOLIC_PROCESS     http://www.broadinstitute.org/gsea/msigdb/cards/BIOPOLYMER_CATABOLIC_PROCESS   BTRC HNRNPD    USE1
6             RNA_METABOLIC_PROCESS            http://www.broadinstitute.org/gsea/msigdb/cards/RNA_METABOLIC_PROCESS HNRNPF HNRNPD SYNCRIP
7                             INTS6                                                                             LSM5   LSM4   LSM3    LSM1
8                               CRK                                                                                                       
9          GLUCAN_METABOLIC_PROCESS         http://www.broadinstitute.org/gsea/msigdb/cards/GLUCAN_METABOLIC_PROCESS    GCK   PYGM   GSK3B
10       PROTEIN_POLYUBIQUITINATION       http://www.broadinstitute.org/gsea/msigdb/cards/PROTEIN_POLYUBIQUITINATION  ERCC8  HUWE1   DZIP3
...

部分的な出力: 最後の列

     V403   V404     V405   V406    V407   V408   V409  V410  V411   V412  V413   V414   V415   V416  V417  V418  V419   V420  V421
1                                                                                                                                  
2   CALCA  CALCB  FAM107A CDK11A RASGRP4 CDK11B   SYN3 GP1BA   TNN   ENO1 PTPRC   MTL5  ISOC2   RHAG   VWF   GPI   HPX SLC5A7   F2R
3                                                                                                                                  
4                                                                                                                                  
5                                                                                                                                  
6    IRF2   IRF3 SLC2A4RG   LSM6   XRCC6  INTS1 HOXD13   RP9 INTS2 ZNF638 INTS3 ZNF254 CITED1 CITED2 INTS9 INTS8 INTS5  INTS4 INTS7
7  POU1F1 TCF7L2 TNFRSF1A  NPAS2   HAND1  HAND2 NUDT21 APEX1  ENO1    ERF  DTX1  SOX30   CBY1   DIS3   SP1   SP2   SP3    SP4  NFIC
8                                                                                                                                  
9                                                                                                                                  
10 

たとえば、行 6 の列エントリは、行 7 と行 8 を埋めるためにループされます。この問題は、非常に多数の列を持つ行エントリに対してのみ発生するようです。これは他の .txt ファイルでも発生しますが、異なる列番号で壊れます。ブレークが発生したすべての行エントリを調べましたが、エントリに異常な文字はありません (すべて標準的な大文字の遺伝子記号です)。

同じ結果で read.table と read.delim の両方を試しました。最初に .txt ファイルを .csv に変換し、同じコードを使用すると、この問題は発生しません (同等の出力については以下を参照してください)。しかし、最初に各ファイルを .csv に変換したくありません。実際に何が起こっているのかを理解したいだけです。

.csv ファイルに変換すると出力が修正されます。

MSigDB.collection = read.table(fileName, header = FALSE, fill = TRUE, as.is = TRUE, sep = ",")

                                V1                                                                               V2     V3     V4      V5      V6
1                  TRNA_PROCESSING                  http://www.broadinstitute.org/gsea/msigdb/cards/TRNA_PROCESSING  ADAT1  TRNT1   FARS2  METTL1
2 REGULATION_OF_BIOLOGICAL_QUALITY http://www.broadinstitute.org/gsea/msigdb/cards/REGULATION_OF_BIOLOGICAL_QUALITY   DLC1   ALS2  SLC9A7   PTGS2
3            DNA_METABOLIC_PROCESS            http://www.broadinstitute.org/gsea/msigdb/cards/DNA_METABOLIC_PROCESS  XRCC5  XRCC4  RAD51C   XRCC3
4    AMINO_SUGAR_METABOLIC_PROCESS    http://www.broadinstitute.org/gsea/msigdb/cards/AMINO_SUGAR_METABOLIC_PROCESS   UAP1   CHIA  GNPDA1     GNE
5     BIOPOLYMER_CATABOLIC_PROCESS     http://www.broadinstitute.org/gsea/msigdb/cards/BIOPOLYMER_CATABOLIC_PROCESS   BTRC HNRNPD    USE1 RNASEH1
6            RNA_METABOLIC_PROCESS            http://www.broadinstitute.org/gsea/msigdb/cards/RNA_METABOLIC_PROCESS HNRNPF HNRNPD SYNCRIP   MED24
7         GLUCAN_METABOLIC_PROCESS         http://www.broadinstitute.org/gsea/msigdb/cards/GLUCAN_METABOLIC_PROCESS    GCK   PYGM   GSK3B   EPM2A
8       PROTEIN_POLYUBIQUITINATION       http://www.broadinstitute.org/gsea/msigdb/cards/PROTEIN_POLYUBIQUITINATION  ERCC8  HUWE1   DZIP3    DDB2
9          PROTEIN_OLIGOMERIZATION          http://www.broadinstitute.org/gsea/msigdb/cards/PROTEIN_OLIGOMERIZATION   SYT1   AASS    TP63   HPRT1
4

1 に答える 1

5

私のコメントを詳しく説明すると...

ヘルプページからread.table:

データ列の数は、入力の最初の 5 行 (5 行未満の場合はファイル全体) を調べることによって決定されますcol.names。指定されていてそれより長い場合は、その長さから決定されます。fillまたはblank.lines.skipが true の場合、これはおそらく間違っている可能性があるためcol.names、必要に応じて指定してください (「例」のように)。


不明なデータセットでこれを回避するcount.fieldsには、 を使用してファイル内の区切り記号の数を決定し、それを使用して使用するcol.namesために作成read.tableします。

x <- max(count.fields("~/Downloads/c5.bp.v4.0.symbols.gmt", "\t"))
Names <- paste("V", sequence(x), sep = "")
y <- read.table("~/Downloads/c5.bp.v4.0.symbols.gmt", col.names=Names, sep = "\t", fill = TRUE)

最初の数行を調べます。実際の全数検査はお任せします。

y[1:6, 1:10]
#                                 V1
# 1                  TRNA_PROCESSING
# 2 REGULATION_OF_BIOLOGICAL_QUALITY
# 3            DNA_METABOLIC_PROCESS
# 4    AMINO_SUGAR_METABOLIC_PROCESS
# 5     BIOPOLYMER_CATABOLIC_PROCESS
# 6            RNA_METABOLIC_PROCESS
#                                                                                 V2     V3     V4
# 1                  http://www.broadinstitute.org/gsea/msigdb/cards/TRNA_PROCESSING  ADAT1  TRNT1
# 2 http://www.broadinstitute.org/gsea/msigdb/cards/REGULATION_OF_BIOLOGICAL_QUALITY   DLC1   ALS2
# 3            http://www.broadinstitute.org/gsea/msigdb/cards/DNA_METABOLIC_PROCESS  XRCC5  XRCC4
# 4    http://www.broadinstitute.org/gsea/msigdb/cards/AMINO_SUGAR_METABOLIC_PROCESS   UAP1   CHIA
# 5     http://www.broadinstitute.org/gsea/msigdb/cards/BIOPOLYMER_CATABOLIC_PROCESS   BTRC HNRNPD
# 6            http://www.broadinstitute.org/gsea/msigdb/cards/RNA_METABOLIC_PROCESS HNRNPF HNRNPD
#        V5      V6         V7    V8     V9   V10
# 1   FARS2  METTL1       SARS  AARS  THG1L   SSB
# 2  SLC9A7   PTGS2      PTGS1 MPV17  SGMS1 AGTR1
# 3  RAD51C   XRCC3      XRCC2 XRCC6  ISG20 PRIM1
# 4  GNPDA1     GNE CSGALNACT1 CHST2  CHST4 CHST5
# 5    USE1 RNASEH1     RNF217 ISG20 CDKN2A  CPA2
# 6 SYNCRIP   MED24       RORB MED23   REST MED21
nrow(y)
# [1] 825

これは、他のファイルをダウンロードして試してみたいと思わない人のための最小限の例です。

最後の行に最初の 5 行よりも多くのフィールドがある 6 行の CSV ファイルを作成し、それを使用read.tableしてみます。

cat("1,2,3,4", "1,2,3,4", "1,2,3,4", "1,2,3,4", 
    "1,2,3,4", "1,2,3,4,5", file = "test1.txt", 
    sep = "\n")
read.table("test1.txt", header = FALSE, sep = ",", fill = TRUE)
#   V1 V2 V3 V4
# 1  1  2  3  4
# 2  1  2  3  4
# 3  1  2  3  4
# 4  1  2  3  4
# 5  1  2  3  4
# 6  1  2  3  4
# 7  5 NA NA NA

最長の行がファイルの最初の 5 行にある場合との違いに注意してください。

cat("1,2,3,4", "1,2,3,4,5", "1,2,3,4", "1,2,3,4", 
    "1,2,3,4", "1,2,3,4", file = "test2.txt", 
    sep = "\n")
read.table("test2.txt", header = FALSE, sep = ",", fill = TRUE)
#   V1 V2 V3 V4 V5
# 1  1  2  3  4 NA
# 2  1  2  3  4  5
# 3  1  2  3  4 NA
# 4  1  2  3  4 NA
# 5  1  2  3  4 NA
# 6  1  2  3  4 NA

この問題を解決するためにcount.fields、各行で検出されたフィールド数のベクトルを返す which を使用します。そこからを取得し、 の引数にmax渡します。col.namesread.table

x <- count.fields("test1.txt", sep=",")
x
# [1] 4 4 4 4 4 5
read.table("test.txt", header = FALSE, sep = ",", fill = TRUE,
           col.names = paste("V", sequence(max(x)), sep = ""))
#   V1 V2 V3 V4 V5
# 1  1  2  3  4 NA
# 2  1  2  3  4 NA
# 3  1  2  3  4 NA
# 4  1  2  3  4 NA
# 5  1  2  3  4 NA
# 6  1  2  3  4  5
于 2013-09-14T03:07:41.637 に答える