使用read.csv2读取时获取正确的行名和列名

时间:2014-01-10 21:36:02

标签: r csv import-from-csv

我有以下CSV文件:

;A;C;D;E;F;G;H;I;K;L;M;N;P;Q;R;S;T;V;W;X;Y
Position1;0,054213776;0,003005945;0,027905128;0,00375423;0,290228233;0,064954976;0,002462278;0,047134442;0,005404894;0,081739388;0,002012803;0,046380669;0,020762236;0,03654459;0,057469835;0,011760176;0,002482397;0,026511666;0,108202585;0,011974854;0,058416108
Position2;0,004057157;0,041518985;0,019806132;0,051610208;0,003572703;0,036402843;0,074879075;0,010325334;0,044981263;0,09328763;0,03897166;0,064762246;0,029074767;0,004175355;0,013691361;0,109767515;0,046100376;0,002930728;0,248865169;0;0,028268182
Position3;0,051305224;0,064958634;0,025061506;0,001931642;0,022646096;0,053596034;0,060665537;0,002355053;0,002426384;0,264133805;0,030836312;0,032183821;0,018242803;0,048333116;0,11381004;0,066739613;0,052130556;0,005772064;0,047369009;2,92638E-05;0,033100145

基本上,我的行名是Position1,Position2,Position3,我的列名是A,B,C ....,Y。我使用以下命令将它们加载到R中:

 data<- read.csv2(f, header=TRUE) 

之前选择了f。

但是,如果我使用data[,1]请求行名称,我会

[1] Position1 Position2 Position3
Levels: Position1 Position2 Position3

似乎没问题。但是,如果我现在通过data[1,]询问列名,我会得到以下内容:

          X          A           C          D          E         F          G           H          I           K          L           M          N          P          Q          R          S           T          V         W        X.1
1 Position1 0.05421378 0.003005945 0.02790513 0.00375423 0.2902282 0.06495498 0.002462278 0.04713444 0.005404894 0.08173939 0.002012803 0.04638067 0.02076224 0.03654459 0.05746983 0.01176018 0.002482397 0.02651167 0.1082026 0.01197485
           Y
1 0.05841611

我不明白。出于某种原因,R认为第一个元素[1,1]应该有一个名称并使用X,而在CSV文件中第一个元素是空的,即

[1,1]=empty   A   C   D   E..........Y
Position1
Position2
Position3

我应该如何阅读 R 中的CSV文件?

编辑:我删除了分号并使用了以下命令:data<- read.table(f, header=TRUE, sep=";") 但是,如果我现在想通过data[,1]请求rownames,我会得到以下内容:

[1] 0,054213776 0,004057157 0,051305224
Levels: 0,004057157 0,051305224 0,054213776

,而data[1,]列名称为:

                    A           C           D          E           F           G           H           I           K           L           M           N           P          Q           R           S           T           V           W
Position1 0,054213776 0,003005945 0,027905128 0,00375423 0,290228233 0,064954976 0,002462278 0,047134442 0,005404894 0,081739388 0,002012803 0,046380669 0,020762236 0,03654459 0,057469835 0,011760176 0,002482397 0,026511666 0,108202585
                    X           Y
Position1 0,011974854 0,058416108

这仍然不正确。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我认为

dat <- read.csv2("csvex.txt",row.names=1)

会做你想做的事。

rownames(dat)
## [1] "Position1" "Position2" "Position3"
dat[,1]
## [1] 0.054213776 0.004057157 0.051305224
dat["Position1",]
##                    A           C          D  ...
## Position1 0.05421378 0.003005945 0.02790513  ...
dat[1,] ## same as dat["Position1",]

R matrixdata.frame中的行名和列名不被视为表数据的一部分(即,它们不是数据的第一行和第一行) - 相反,它们作为单独的属性保存,可以使用colnames(dat)rownames(dat)检索(并使用rownames(dat) <- ...colnames(dat) <- ...进行设置)。 dimnames()对于同时检索或设置列名和行名非常有用......

header=TRUE(这是read.csv[2]的默认值)告诉R它应该将CSV文件的第一行视为列名(而不是假设它们是数据,并且它应该使通用列名称)。 row.names=1告诉R它应该将CSV文件的第一列视为行名(同上)。

答案 1 :(得分:0)

标题行中A前面有一个分号。我想知道这是否会对阅读造成严重破坏?删除它,看看。