[英]issue with reading and writing a csv file in R language
我有一個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
有什么幫助嗎?
另請注意,第一列是自動添加的,我不需要它,那么如何擺脫該列呢?
這里有兩個問題。
要讀取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]
我不確定我是否了解您要嘗試執行的操作,但這是一些代碼,該代碼讀取前兩列缺少標題的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.