使用Strsplit和R连接拆分R中的大型数据文件

时间:2015-07-27 04:46:43

标签: r strsplit

您好我正在尝试将大型数据文件读入R.它是一个制表符分隔文件,但前两列填充了由“|”分隔的多个数据。该文件看起来像:

A|1   B|2   0.5  0.4
C|3   D|4   0.9  1

我只关心第一列和第二列以及第三和第四列中的第一个值。最后,我希望最终得到每行的向量,如下所示:

A  B  0.5  0.4

我正在使用连接来读取文件:

con <- file("inputfile.txt", open = "r")
lines <- readLines(con)

给了我:

lines[1]
[1] "A|1\tB|2/t0.5\t0.4"

然后我使用strsplit拆分制表符分隔文件:

linessplit <- strsplit(lines, split="\t")

给了我:

linessplit[1]
[1] "A|1" "B|2" 
[3] "0.5" "0.4"

当我尝试以下操作将“A | 1”拆分为“A”“1”时:

line1 <- linessplit[1]
l1 <- strsplit(line1[1], split = "|")

我明白了:

"Error in strsplit(line1[1], split = "|") : non-character argument"

有没有人可以解决这个问题? 谢谢!

3 个答案:

答案 0 :(得分:5)

由于您提供了一种方法,我解释了代码中的错误,即使对于您的问题,也许您必须考虑另一种方法。 无论如何,抛开个人对代码的品味,问题是:

  1. 您必须使用双括号提取列表的第一个元素 if( Model.CollectionDate.HasValue)
  2. line1[[1]]参数接受常规 表达式。如果你提供split这是一个元字符,它就不会 按原样阅读 。您必须使用|或(根据@nongkrong的建议)将其转义为必须使用\\|参数,该参数允许您将字符串与完全匹配(例如,没有它们意思是元字符)。
  3. 最终代码为fixed = T

    作为最后的个人考虑,您可以考虑l1 <- strsplit(line1[[1]], split = "\\|")解决方案:

    lapply

答案 1 :(得分:0)

这是我对原始问题的解决方案,

分割线

"A|1\tB|2\t0.5\t0.4"
"C|3\tD|4\t0.9\t1"

A  B  0.5  0.4
C  D  0.9  1

以下是我的代码:

lines <- c("A|1\tB|2\t0.5\t0.4", "C|3\tD|4\t0.9\t1", "E|5\tF|6\t0.7\t0.2")
lines

library(reshape2)
linessplit <- colsplit(lines, pattern="\t", names=c(1:4))
linessplit

split_n_select <- function(x, sel=c(1), pat="\\|", nam=c(1:2)){
  tmp <- t(colsplit(x, pattern=pat, names=nam))
  tmp[sel,]
}

linessplit2 <- sapply(linessplit, split_n_select)
linessplit2

将其分解:

  1. 将原始数据读入

    lines <- c("A|1\tB|2\t0.5\t0.4", "C|3\tD|4\t0.9\t1", "E|5\tF|6\t0.7\t0.2")
    lines
    

    结果:

     [1] "A|1\tB|2\t0.5\t0.4" "C|3\tD|4\t0.9\t1"   "E|5\tF|6\t0.7\t0.2"
    
  2. 加载 reshape2 库以导入函数 colsplit ,然后将其用于模式&#34; \ t&#34;将行拆分为4列,名为1,2,3,4。

    library(reshape2)
    linessplit <- colsplit(lines, pattern="\t", names=c(1,2,3,4))
    linessplit
    

    结果:

        1   2   3   4
    1 A|1 B|2 0.5 0.4
    2 C|3 D|4 0.9 1.0
    3 E|5 F|6 0.7 0.2
    
  3. 创建一个函数来取一行,分成行并选择我们想要的行。

    将linessplit的第一行放入 colsplit

    tmp <- colsplit(linessplit[1,], pattern="\\|", names=c(1:2))
    tmp
    

    结果:

        1  2
    1   A  1
    2   B  2
    3 0.5 NA
    4 0.4 NA
    

    转置

    tmp <- t(colsplit(linessplit[1,], pattern="\\|", names=c(1:2)))
    tmp
    

    结果:

      [,1] [,2] [,3]  [,4] 
    1 "A"  "B"  "0.5" "0.4"
    2 " 1" " 2" NA    NA   
    

    选择第一行:

    tmp[1,]
    

    结果:

    [1] "A"   "B"   "0.5" "0.4"
    

    将上述步骤设为 split_n_select

    split_n_select <- function(x, sel=c(1), pat="\\|", nam=c(1:2)){
      tmp <- t(colsplit(x, pattern=pat, names=nam))
      tmp[sel,]
    }
    
  4. 使用sapply将函数 split_n_select 应用于linessplit中的每一行

    linessplit2 <- sapply(linessplit, split_n_select)
    linessplit2
    

    结果:

         1   2   3     4    
    [1,] "A" "B" "0.5" "0.4"
    [2,] "C" "D" "0.9" "1"  
    [3,] "E" "F" "0.7" "0.2"
    
  5. 您还可以通过添加 sel = c(2)

    来选择第二行
    linessplit2 <- sapply(linessplit, split_n_select, sel=c(2))
    linessplit2
    

    结果:

         1   2   3  4 
    [1,] "1" "2" NA NA
    [2,] "3" "4" NA NA
    [3,] "5" "6" NA NA
    

答案 2 :(得分:-2)

更改

line1 <- linessplit[1]
l1 <- strsplit(line1[1], split = "|")

line1 <- linessplit[1]
l1 <- strsplit(line1[1], split = "[|]") #i added square brackets