所以,我在R中做了这个功能。
> reps <- function(s, n) paste(rep(s, n), collapse = "") # repeat s n times
>
> find.string <- function(strinag, th = 3, len = floor(nchar(string)/th)) {
+ for(k in len:1) {
+ pat <- paste0("(.{", k, "})", reps("\\1", th-1))
+ r <- regexpr(pat, string, perl = TRUE)
+ if (attr(r, "capture.length") > 0) break
+ }
+ if (r > 0) substring(string, r, r + attr(r, "capture.length")-1) else ""
+ }
此功能主要用于查找模式。例如:如果我输入序列为100100100,则输出“100”(满足最小阈值的最大长度模式= 3)。但是,如果传递了诸如100110之类的字符串,则它不会输出任何内容,因为没有形成连续模式。
现在,我将此函数应用于具有这种格式的文件(1000行)。
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
0 2 4 1 0 0 1 0 0 1 0 0
1 1 2 1 0 0 1 0 1 0 1 0
2 ....................................
3
4
5
现在,之后,我这样做了,不同列(V3-V11)中的数字作为字符串传递给我所做的函数。
输入&lt; - do.call(cbind,df [,3:ncol(df)])
然后,
apply(input, 1, function(x) print(gsub(", ","",toString(x)))).
但是,这只会产生输出,
输出文件:
110
01
10
10
我想要的是,产生输出的行的前两列也应该包含在输出文件中。
所以,假设第1行产生一个输出,因此,它应该包含在输出文件中,
2 4 100
1 2 10
................
为了做到这一点,我应该对现有代码进行哪些更改?
答案 0 :(得分:0)
我假设您写入输出文件的数据存储在某个变量中,比如说x
。由于您在数据的所有行中应用了函数,因此输出和行的顺序将相同。因此,您可以在
write.table(cbind(df[,1:2], x), "outfile.txt")
这应该可以正确恢复原始行。