您好我正在尝试将大型数据文件读入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"
有没有人可以解决这个问题? 谢谢!
答案 0 :(得分:5)
由于您提供了一种方法,我解释了代码中的错误,即使对于您的问题,也许您必须考虑另一种方法。 无论如何,抛开个人对代码的品味,问题是:
if( Model.CollectionDate.HasValue)
line1[[1]]
参数接受常规
表达式。如果你提供split
这是一个元字符,它就不会
按原样阅读 。您必须使用|
或(根据@nongkrong的建议)将其转义为必须使用\\|
参数,该参数允许您将字符串与完全匹配(例如,没有它们意思是元字符)。最终代码为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
将其分解:
将原始数据读入行
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"
加载 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
创建一个函数来取一行,分成行并选择我们想要的行。
将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,]
}
使用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"
您还可以通过添加 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