3
votes

I am new to R and want to read a csv file. But I got error when I try to read it. My csv file are as follow:

,Zbot,Sirefef,Fareit,Winwebsec,FakeSysdef,Winwebsec,Winwebsec,Winwebsec,Fareit,Fareit,Sirefef,Winwebsec,Winwebsec,Winwebsec,Winwebsec
Zbot,0,134,45,651,182,245,986,64,63,34,134,166,52,337,225
Sirefef,142,0,124,679,200,273,1018,156,125,122,164,198,120,371,257
Fareit,48,124,0,644,166,234,978,82,64,51,135,167,49,338,224
Winwebsec,651,499,470,0,575,556,1087,525,490,485,501,511,483,600,582
FakeSysdef,178,172,143,535,0,311,1052,196,163,152,204,234,154,405,285
Winwebsec,245,199,168,478,229,0,997,217,186,183,199,209,183,348,272
Winwebsec,986,752,719,821,784,727,0,774,739,734,750,760,734,851,829
Winwebsec,80,160,85,506,179,204,757,0,100,85,173,205,89,376,264
Fareit,65,95,32,468,141,164,715,78,0,57,135,165,59,336,226
Fareit,52,122,51,468,143,166,717,68,40,0,135,163,49,336,224
Sirefef,136,118,85,449,150,147,696,123,83,83,0,146,100,317,207
Winwebsec,164,138,105,449,170,145,696,143,103,103,80,0,118,315,215
Winwebsec,52,116,51,466,143,166,717,66,42,32,83,103,0,336,226
Winwebsec,335,267,234,496,301,246,745,272,232,234,213,213,234,0,346
Winwebsec,225,204,171,519,228,217,774,207,169,169,150,160,169,291,0

And when I use this command in RStudio I got error: Command:

> tb = read.csv("/home/hossein/Documents/LiClipse Workspace/test.csv", row.names = 1);

error:

Error in read.table(file = file, header = header, sep = sep, quote = quote, : duplicate 'row.names' are not allowed

I also try to remove the error and use this command:

 > tb = read.csv("/home/hossein/Documents/LiClipse Workspace/test.csv", row.names = NULL);

but when i view the output is that it can not keep the structure of the square matrix. Could you help me what should I do?

3
First of all, the first line of the dataset starts with a comma. Second, why don't you try using the GUI feature of loading datasets with RStudio? If you do that, you might get a better chance at detecting why your data is not loading properly.Abdou

3 Answers

2
votes

R do not support duplicated row names, see ?row.names:

All data frames have a row names attribute, a character vector of length the number of rows with no duplicates nor missing values.

Given this, you can import your data then make row names unique with the function make.names. This is a bit ugly, but I think it solves your problem. See the example below with the data you provided.

table <- read.csv("data.csv", row.names = NULL)

### Save row names in a separte object:
rows <- table$X

### Remove the colunm with row.names:
table <- table[,-1]

### Create unique Row.names with the function `make.names`
rownames(table) <- make.names(rows, unique=TRUE)

### Check results:
dim(table)
#> [1] 15 15
head(table)
#>             Zbot Sirefef Fareit Winwebsec FakeSysdef Winwebsec.1
#> Zbot           0     134     45       651        182         245
#> Sirefef      142       0    124       679        200         273
#> Fareit        48     124      0       644        166         234
#> Winwebsec    651     499    470         0        575         556
#> FakeSysdef   178     172    143       535          0         311
#> Winwebsec.1  245     199    168       478        229           0
#>             Winwebsec.2 Winwebsec.3 Fareit.1 Fareit.2 Sirefef.1
#> Zbot                986          64       63       34       134
#> Sirefef            1018         156      125      122       164
#> Fareit              978          82       64       51       135
#> Winwebsec          1087         525      490      485       501
#> FakeSysdef         1052         196      163      152       204
#> Winwebsec.1         997         217      186      183       199
#>             Winwebsec.4 Winwebsec.5 Winwebsec.6 Winwebsec.7
#> Zbot                166          52         337         225
#> Sirefef             198         120         371         257
#> Fareit              167          49         338         224
#> Winwebsec           511         483         600         582
#> FakeSysdef          234         154         405         285
#> Winwebsec.1         209         183         348         272
as.dist(table)
#>             Zbot Sirefef Fareit Winwebsec FakeSysdef Winwebsec.1
#> Sirefef      142                                                
#> Fareit        48     124                                        
#> Winwebsec    651     499    470                                 
#> FakeSysdef   178     172    143       535                       
#> Winwebsec.1  245     199    168       478        229            
#> Winwebsec.2  986     752    719       821        784         727
#> Winwebsec.3   80     160     85       506        179         204
#> Fareit.1      65      95     32       468        141         164
#> Fareit.2      52     122     51       468        143         166
#> Sirefef.1    136     118     85       449        150         147
#> Winwebsec.4  164     138    105       449        170         145
#> Winwebsec.5   52     116     51       466        143         166
#> Winwebsec.6  335     267    234       496        301         246
#> Winwebsec.7  225     204    171       519        228         217
#>             Winwebsec.2 Winwebsec.3 Fareit.1 Fareit.2 Sirefef.1
#> Sirefef                                                        
#> Fareit                                                         
#> Winwebsec                                                      
#> FakeSysdef                                                     
#> Winwebsec.1                                                    
#> Winwebsec.2                                                    
#> Winwebsec.3         757                                        
#> Fareit.1            715          78                            
#> Fareit.2            717          68       40                   
#> Sirefef.1           696         123       83       83          
#> Winwebsec.4         696         143      103      103        80
#> Winwebsec.5         717          66       42       32        83
#> Winwebsec.6         745         272      232      234       213
#> Winwebsec.7         774         207      169      169       150
#>             Winwebsec.4 Winwebsec.5 Winwebsec.6
#> Sirefef                                        
#> Fareit                                         
#> Winwebsec                                      
#> FakeSysdef                                     
#> Winwebsec.1                                    
#> Winwebsec.2                                    
#> Winwebsec.3                                    
#> Fareit.1                                       
#> Fareit.2                                       
#> Sirefef.1                                      
#> Winwebsec.4                                    
#> Winwebsec.5         103                        
#> Winwebsec.6         213         234            
#> Winwebsec.7         160         169         291
1
votes

You can do this in a few simple steps as follows:

d = read.csv('path/to/test.csv') # import the data
row.names(d) = make.unique(as.character(d[, 1])) # create the row names from the first column
d = d[, -1] # remove the first column now that you don't need it anymore

This maintains your square matrix:

dim(d) # still a 15x15 matrix
0
votes

The first row starts with a blank field, so it might be convenient to use the skip = 1 argument, perhaps since read.csv not understand the input function as a rectangular array.