0

我有一个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

有什么帮助吗?

还请注意自动添加的第一列,我不需要它,那么我怎样才能摆脱那一列呢?

4

2 回答 2

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)
    

使用步骤 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]
于 2012-12-28T16:17:56.670 回答
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
于 2012-12-28T18:41:22.053 回答