【问题标题】:Skip some lines with fread用 fread 跳过一些行
【发布时间】:2015-06-22 05:29:15
【问题描述】:

我有兴趣在标题名称之前跳过我的数据框的某些行。如何跳过ID_REF 之前的所有行,或者如果ID_REF 不存在,请检查模式ILMN_ 并删除所有保持立即的行,如果不包含#

# GEOarchive matrix file.               
ID_REF  1688628068_A.AVG_Signal 1688628068_A.Avg_NBEADS 1688628068_A.BEAD_STDERR 1688628068_A.Detection Pval
ILMN_1343291    62821.84         135                               413.9399                       0
ILMN_1343292    3255.167         131                               47.76587                       0
ILMN_1343293    42924.91         152                               539.3026                       0
ILMN_1343294    55255.21         100                               746.1457                       0

【问题讨论】:

  • 看起来你的列名比列多。 1688628068_A.Detection Pval 是单列吗?此外,如果文件有需要跳过的#,则只需read.table('yourfile.txt', header=TRUE, fill=TRUE) 即可读取。
  • @akrun 是的,这是单列
  • 一种选择是将文件中的列名更改为1688628068_A.Detection_Pval 并在没有fill=TRUE 的情况下读取
  • 如果你有其他行没有#,另一种选择是使用awk,即管道。 `read.table(pipe("awk '/^(ID_REF|ILMN)/{matched = 1}matched { print }' file.txt"), header=TRUE, fill=TRUE)
  • 如果我想从路径读取文件,我可以使用read.table(path)

标签: r fread


【解决方案1】:

在 linux 中,您可以将awkfread 一起使用,也可以与read.table 一起使用。在这里,我使用awk将分隔符更改为,

pth <- '/home/akrun/file.txt' #change it to your path
v1 <- sprintf("awk '/^(ID_REF|LMN)/{ matched = 1} matched {$1=$1; print}' OFS=\",\" %s", pth)

并通过fread阅读

library(data.table)
fread(v1)
#         ID_REF 1688628068_A.AVG_Signal 1688628068_A.Avg_NBEADS
#1: ILMN_1343291               62821.840                     135
#2: ILMN_1343292                3255.167                     131
#3: ILMN_1343293               42924.910                     152
#4: ILMN_1343294               55255.210                     100
#   1688628068_A.BEAD_STDERR 1688628068_A.Detection_Pval
#1:                413.93990                           0
#2:                 47.76587                           0
#3:                539.30260                           0
#4:                746.14570                           0

或使用read.table

read.table(pipe(v1), header=TRUE, sep=',', check.names=FALSE)
#       ID_REF 1688628068_A.AVG_Signal 1688628068_A.Avg_NBEADS
#1 ILMN_1343291               62821.840                     135
#2 ILMN_1343292                3255.167                     131
#3 ILMN_1343293               42924.910                     152
#4 ILMN_1343294               55255.210                     100
#  1688628068_A.BEAD_STDERR 1688628068_A.Detection_Pval
#1                413.93990                           0
#2                 47.76587                           0
#3                539.30260                           0
#4                746.14570                           0

注意:我将列名从 1688628068_A.Detection Pval 更改为 1688628068_A.Detection_Pval

由于某种原因,多余的空格会导致fread 出现问题。对于read.table,这不是问题。因此,以下内容也适用于 read.table

 v2 <- sprintf("awk '/^(ID_REF|ILMN)/{ matched = 1} matched { print}' %s", pth)

 read.table(pipe(v2), header=TRUE, check.names=FALSE)
 #       ID_REF 1688628068_A.AVG_Signal 1688628068_A.Avg_NBEADS
 #1 ILMN_1343291               62821.840                     135
 #2 ILMN_1343292                3255.167                     131
 #3 ILMN_1343293               42924.910                     152
 #4 ILMN_1343294               55255.210                     100
 #  1688628068_A.BEAD_STDERR 1688628068_A.Detection_Pval
 #1                413.93990                           0
 #2                 47.76587                           0
 #3                539.30260                           0
 #4                746.14570                           0

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多