2012-08-29 57 views
1

我有一個lagre數據幀類似於此格式:如何刪除尾隨在write.table空間中的R

line1 
line2<tab>value1 

當R中使用read.csv讀它被迫使進入一個數據幀如下:

V1<tab>V2 
line1<tab>NA 
line2<tab>value1 

我可以用空字符串替換NA,但是,當我寫使用write.table,我在輸出文件中第1行後得到一個標籤,空的空間。

如何讓這個輸出是作爲輸入即尾隨標籤空白被移除

示例文件附加相同的格式:

#Sample SGA file format 
@HD VN:1.0.0 IA:NA 
@PL NM:TEST 
1 1 705 50947 YDL185W YOR202W - - - 
1 2 377 50947 YDL185W YOR202W - - - 
1 3 317 50947 YDL185W YOR202W - - - 
... 
@SP CF:ORF,IGNA 
TEST 1 
TEST2 1 

頭(dput(數據) )

structure(list(V1 = c("#Sample SGA file format", "@HD", 
"@PL", "1", "1", "1"), V2 = c("", "VN:1.0.0", "NM:TEST", "1", 
"2", "3"), V3 = c("", "IA:NA", "", "705", "377", "317"), V4 = c(NA, 
NA, NA, 50947L, 50947L, 50947L), V5 = c("", "", "", "YDL185W", 
"YDL185W", "YDL185W"), V6 = c("", "", "", "YOR202W", "YOR202W", 
"YOR202W"), V7 = c("", "", "", "-", "-", "-"), V8 = c("", "", 
"", "-", "-", "-"), V9 = c("", "", "", "-", "-", "-")), .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9"), row.names = c(NA, 
6L), class = "data.frame") 

和STR(數據)

'data.frame': 1541 obs. of 9 variables: 
$ V1: chr "#Sample SGA file format" "@HD" "@PL" "1" ... 
$ V2: chr "" "VN:1.0.0" "NM:TEST" "1" ... 
$ V3: chr "" "IA:NA" "" "705" ... 
$ V4: int NA NA NA 50947 50947 50947 50947 50947 50947 50947 ... 
$ V5: chr "" "" "" "YDL185W" ... 
$ V6: chr "" "" "" "YOR202W" ... 
$ V7: chr "" "" "" "-" ... 
$ V8: chr "" "" "" "-" ... 
$ V9: chr "" "" "" "-" ... 
+2

你可以'輸入(你的數據)'或它的一部分在這裏。這聽起來像是「NA」與空白混淆的一部分。 R中的數字沒有空格,而是用NA表示。如果您強制將「NA」設爲空字符串,則整列將轉換爲字符。但是一旦讀入數據後,我就不會知道你的數據。你也可以用'str(yourdata)'來查看數據。' – Justin

+0

你爲什麼要將數據存儲在數據框中?它似乎不是一個數據框(即一張表),所以也許你可以將它存儲在一個列表中。 –

+0

@Justin我附加了一些數據。 GaborCsardi我的數據中嵌入了2個數據框,因此我提取數據框,處理它們並在完成時將它們放回。 – by0

回答

4

我敢打賭猜測。聽起來你可以做兩件事之一。

首先,你可以使用

data[is.na(data)] <- '' 
library(stringr) 
write.table(str_trim(apply(data, 1, paste, collapse='\t')), 
      'fileout.tsv', 
      row.names=FALSE) 

或者你可以使用命令行實用程序像sed從文件中刪除尾隨空白:

sed -e :a -e 's/^.\{1,77\}$/ & /;ta' 
3

這是非常複雜的,但這裏。

  1. 讀一號線爲標題在read.csv:使用writefoo <- read.csv("input.csv")

  2. 寫只是第一列名:write(colnames(foo)[1],"out/output.csv")

  3. 最後,寫表的使用append並沒有列名,其餘:write.table(foo,"output.csv",sep=",",row.names=F,col.names=F,append=T,quote=F)

這應該讓你在輸入文件中以相同的格式輸出文件。

+0

嗯,這可行,但是,我擁有的數據要大得多。即在中間有很多線,如線1。 – by0

-1

如果你想read.table的行爲完全一樣read.csv做,所有你需要做的是使參數相同

read.table(file, header = TRUE, sep = ",", quote="\"", dec=".", 
    fill = TRUE, comment.char="") 
2

這與賈斯汀的回答,使用正則表達式。

cn <- file("output.txt",open="w") #opens write connection to file 
writeLines(paste(names(data),collapse="\t"),con=cn) #writes header 
#converts data frame into vector of character, with fields separated by tabs 
to.print <- apply(data,1,paste,collapse="\t") 
to.print <- gsub("\\tNA$","",to.print) #deletes trailing <tab>NA 
writeLines(to.print,con=cn) #writes data frame rows 
close(cn)