在R语言中读写csv文件的问题

时间:2012-12-28 16:05:13

标签: r csv

我有一个csv格式的表,数据如下:

            1           3            1          2
1415_at 1   8.512147859 8.196725061 8.174426394 8.62388149
1411_at 2   9.119200527 9.190318548 9.149239039 9.211401637
1412_at 3   10.03383593 9.575728316 10.06998673 9.735217522
1413_at 4   5.925999419 5.692092375 5.689299161 7.807354922

当我阅读时:

m <- read.csv("table.csv")

并打印m的值,我注意到它们改为:

        X   X.1        X1       X3      X1.1       X4
1 1415_at   1       8.512148 8.196725  8.174426 8.623881

我做了一些操作,只保留那些标记为1或2的列,所以我这样做:

smallerdat <- m[ grep("^X$|^X.1$|^X1$|^X2$|1\\.|2\\." , names(m) ) ]

write.csv(smallerdat,"table2.csv")
它写了我带有那些令人讨厌的标题的文件,并添加了第一列,我不需要它:

      X   X.1        X1             X1.1       X2
1 1415_at   1       8.512148   8.174426 8.623881

所以当我在Excel中打开这些数据时,标题仍然是X,X.1和儿子。我需要的是标题保持不变:

                     1      1           2
1415_at 1       8.196725061 8.174426394 8.62388149

任何帮助?

请注意第一列是自动添加的,我不需要它,所以我怎么能摆脱那一列?

2 个答案:

答案 0 :(得分:4)

这里有两个问题。

  1. 要阅读CSV文件,请使用:

    m <- read.csv("table.csv", check.names = FALSE)
    

    请注意,通过执行此操作,您无法轻松使用列名称。您必须使用反引号引用它们,并且由于列名重复,很可能仍会遇到问题:

    m$1
    # Error: unexpected numeric constant in "mydf$1"
    mydf$`1`
    # [1]  8.512148  9.119201 10.033836  5.925999
    
  2. 要将“m”对象写入CSV文件,请使用:

    write.csv(m, "table2.csv", row.names = FALSE)
    

  3. 使用步骤1中的方法读取文件后,您可以按如下方式进行分组。如果您想要第一列以及任何名为“3”或“4”的列,您可以使用:

    m[names(m) %in% c("", "3", "4")]
    #                    3        4
    # 1 1415_at 1 8.196725 8.623881
    # 2 1411_at 2 9.190319 9.211402
    # 3 1412_at 3 9.575728 9.735218
    # 4 1413_at 4 5.692092 7.807355
    

    更新:在使用write.csv

    之前修复名称

    如果您不想因任何原因从第1步开始,您仍然可以解决问题。虽然您已成功使用grep语句获取子集,但这不会更改列名称(不确定为什么您应该这样做)。您必须使用gsub或其他regex解决方案之一来执行此操作。

    以下是您在CSV中阅读方式的列名称:

    names(m)
    # [1] "X"    "X.1"  "X1"   "X3"   "X1.1" "X2"  
    

    你想要:

    • 删除所有“X”
    • 删除所有“.some-number”

    所以,这是一个解决方法:

    # Change the names in your original dataset
    names(m) <- gsub("^X|\\.[0-9]$", "", names(m))
    # Create a temporary object to match desired names
    getme <- names(m) %in% c("", "1", "2")
    # Subset your data
    smallerdat <- m[getme]
    # Reassign names to your subset
    names(smallerdat) <- names(m)[getme]
    

答案 1 :(得分:0)

我不确定我是否理解您的尝试,但是这里有一些代码会读取前两列缺少标题的csv文件,只选择标题为1或2的列然后写入新的保留列名1或2的数据文件。

# first read in only the headers and deal with the missing 
# headers for columns 1 and 2

b <- readLines('c:/users/Mark W Miller/simple R programs/missing_headers.csv', 
     n = 1)
b <- unlist(strsplit(b, ","))
b[1] <- 'name1'
b[2] <- 'name2'
b <- gsub(" ","", b, fixed=TRUE)
b

# read in the rest of the data file

my.data <- (
 read.table(file = "c:/users/mark w miller/simple R programs/missing_headers.csv", 
 na.string=NA, header = F, skip=1, sep=','))

colnames(my.data) <- b

# select the columns with names of 1 or 2

my.data <- my.data[names(my.data) %in% c("1", "2")]

# retain the original column names of 1 or 2

names(my.data) <- floor(as.numeric(names(my.data)))

# write the new data file with original column names

write.csv(
  my.data, "c:/users/mark w miller/simple R programs/missing_headers_out.csv",
            row.names=FALSE, quote=FALSE)

这是输入数据文件。请注意第1列和第2列缺少名称的逗号:

       ,  ,             1,           3,           1,          2
1415_at, 1,   8.512147859, 8.196725061, 8.174426394, 8.62388149
1411_at, 2,   9.119200527, 9.190318548, 9.149239039, 9.211401637
1412_at, 3,   10.03383593, 9.575728316, 10.06998673, 9.735217522
1413_at, 4,   5.925999419, 5.692092375, 5.689299161, 7.807354922

这是输出数据文件:

1,1,2
8.512147859,8.174426394,8.62388149
9.119200527,9.149239039,9.211401637
10.03383593,10.06998673,9.735217522
5.925999419,5.689299161,7.807354922