我有一个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
任何帮助?
请注意第一列是自动添加的,我不需要它,所以我怎么能摆脱那一列?
答案 0 :(得分:4)
这里有两个问题。
要阅读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
要将“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"
你想要:
所以,这是一个解决方法:
# 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