【问题标题】:How to remove trailing spaces in write.table in R如何删除 R 中 write.table 中的尾随空格
【发布时间】:2012-08-29 20:21:05
【问题描述】:

我有一个类似于这种格式的 lagre 数据框:

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

头部(输入(数据))

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  "" "" "" "-" ...

【问题讨论】:

  • 你可以在这里dput(yourdata) 或其中的一部分。听起来混乱的一部分是NA vs 空白。 R 中的数字没有空格,而是用 NA 表示。如果您强制NA 为空白字符串,则整列将转换为字符。但是,一旦将数据读入 R,我就无法确定。您也可以使用 str(yourdata) 查看数据
  • 为什么将数据存储在数据框中?它似乎不是一个数据框(即一个表),所以也许你可以将它存储在一个列表中。
  • @Justin 我已经附加了一些数据。 GaborCsardi 我的数据中嵌入了 2 个数据帧,因此我提取数据帧,对其进行处理并在完成后将它们放回。
  • 请使用dput(yourdata)dput(head(yourdata)),这样我们就可以在R中看到它的结构。您也可以向我们展示str(yourdata)的输出和空工作区中的完整代码,直到您拥有加载的数据。否则,仍然很难调试您向我们展示的内容。
  • @Justin 你去。加载数据的代码并不简单。它以 read.csv 开头,其余部分是使用标题标签 '@' 提取数据帧,验证列/数据。这是一个非常大的管道的一部分,除了 read.csv 之外,没有太多可以为您提供的信息

标签: r file-io


【解决方案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'

【讨论】:

    【解决方案2】:

    这是非常令人费解的,但在这里。

    1. read.csv中读取line1作为标题:foo &lt;- read.csv("input.csv")

    2. 使用write只写第一列名称: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)

    这应该会为您提供与输入文件相同格式的输出文件。

    【讨论】:

    • 嗯,这可行,但是,我拥有的数据要大得多。 IE。中间有很多行,比如第 1 行。
    【解决方案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)
    

    【讨论】:

      【解决方案4】:

      如果您希望read.table 的行为与read.csv 完全相同,您需要做的就是使参数相同

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 2012-01-03
        • 2020-06-04
        • 1970-01-01
        相关资源
        最近更新 更多