Reputation: 303
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?
Upvotes: 3
Views: 2613
Reputation: 986
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
Upvotes: 2
Reputation: 6720
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
Upvotes: 1
Reputation: 1846
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.
Upvotes: 0