簡體   English   中英

用R語言讀取和寫入csv文件的問題

[英]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

有什么幫助嗎?

另請注意,第一列是自動添加的,我不需要它,那么如何擺脫該列呢?

這里有兩個問題。

  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]

我不確定我是否了解您要嘗試執行的操作,但這是一些代碼,該代碼讀取前兩列缺少標題的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM