1

この形式に似たラグデータ フレームがあります。

line1
line2<tab>value1

read.csv を使用して R で読み取られると、次のようにデータ フレームに強制されます。

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

head(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  "" "" "" "-" ...
4

4 に答える 4

4

私は推測を賭けます。2つのうちの1つを行うことができるようです。

まず、使用できます

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'
于 2012-08-30T16:28:19.127 に答える
3

これは非常に複雑ですが、これで終わりです。

  1. のヘッダーとして line1 を読み取りますread.csvfoo <- read.csv("input.csv")

  2. を使用して最初の列名だけを書き込みますwritewrite(colnames(foo)[1],"out/output.csv")

  3. 最後に、列名を使用してappend、または列名を使用せずに、テーブルの残りの部分を記述します。write.table(foo,"output.csv",sep=",",row.names=F,col.names=F,append=T,quote=F)

これにより、入力ファイルと同じ形式の出力ファイルが得られます。

于 2012-08-29T21:18:36.623 に答える
3

これは、正規表現を使用したジャスティンの回答に似ています。

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)
于 2012-08-31T18:52:55.823 に答える
-1

read.tableまったく同じように動作させたい場合read.csvは、パラメータを同じにするだけです。

read.table(file, header = TRUE, sep = ",", quote="\"", dec=".",
     fill = TRUE, comment.char="")
于 2012-08-29T21:29:04.067 に答える