Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 基于列标题添加新列_Unix_R - Fatal编程技术网

Unix 基于列标题添加新列

Unix 基于列标题添加新列,unix,r,Unix,R,我正在使用R在一列中转换数百万行数据,如下所示 fixedStep chrom=chr7 start=10239 step=1 0.064 0.064 0.064 0.055 0.055 0.089 0.076 fixedStep chrom=chr7 start=10262 step=1 0.076 0.076 0.089 0.076 0.076 0.076 0.076 0.089 0.089 0.076 0.089 0.076 0.089 0.089 fixedStep chrom=chr7

我正在使用R在一列中转换数百万行数据,如下所示

fixedStep chrom=chr7 start=10239 step=1
0.064
0.064
0.064
0.055
0.055
0.089
0.076
fixedStep chrom=chr7 start=10262 step=1
0.076
0.076
0.089
0.076
0.076
0.076
0.076
0.089
0.089
0.076
0.089
0.076
0.089
0.089
fixedStep chrom=chr7 start=10398 step=1
0.076
0.089
0.089
0.089
0.089
0.076
对此

10239 0.064
10240 0.064
10241 0.064
10242 0.055
10243 0.055
10244 0.089
10245 0.076
10262 0.076
10263 0.076
10264 0.089
10265 0.076
10266 0.076
10267 0.076
10268 0.076
10269 0.089
10270 0.089
10271 0.076
10272 0.089
10273 0.076
10274 0.089
10275 0.089
10398 0.076
10399 0.089
10400 0.089
10401 0.089
10402 0.089
10403 0.076
i、 例如,我想添加一列新的数字(在数据之前或之后,在上面的示例中,它位于数据之前)。新列的编号从
start=value
开始,递增1(
step=1
),直到到达新列标题(
fixedStep chrom=chr7 start=10262 step=1
)。发生这种情况时,数字从
start=new value
开始,然后再次递增1(
step=1
),直到出现新的列标题..以此类推

因为它是一个大文件,所以我无法将它加载到R工作区中。最好将它与UNIX/linux工具结合起来执行此操作。

因为您说过UNIX

#!/usr/bin/awk -f
/^fixedStep/ {
  i=int(substr($0,match($0,"start=")+6))
  d=int(substr($0,match($0,"step=")+5))
}
!/^f/ { print i, $0; i+=d }
它的作用:在以“fixedStep”开头的行上,它找到“start=”的位置,添加6(长度为“start=”),从该位置开始取子字符串,并将其截断为整数值,然后将其分配给
i
(在awk中,整数和字符串可以互换,并且“12345 step=1”作为一个值为12345的整数可以很好地工作,但我们希望稍后只打印整数部分,因此在这里截断它是有意义的)。与“步骤”类似


在不以“f”开头的行上,它打印
i
和该行,并将
d
添加到
i

您可以使用功能
readLines
逐个扫描文件。这样,您就不必将所有内容都加载到内存中。一种可能是使用以下函数

不简洁,不快速(当您逐行读取时),但它提供了数据帧,而无需读取整个文件。如果您只想生成一个新文件,请务必使用R以外的其他方法。这里给出的awk解决方案似乎是最好的解决方案

ReadFile <- function(file){

  DF <- data.frame(ID=numeric(0),value=numeric(0))

   while(1){

    z <- readLines(file,1)
    if(length(z)==0 | z=="") {break}

    Start <- if(grepl("start",z))
      as.numeric(gsub(".+start=(\\d+).+","\\1",z))

    if(is.null(Start)){
        DF <- rbind(DF,
            data.frame(ID=ID,value=as.numeric(z))
        )
        ID <- ID + 1
    } else {
      ID <- Start
    }
  }
  return(DF)
}

ReadFile对于您的示例输出,“增量为1”属性似乎不是真的?@Jouni:是的,但是文件中有不同的头…谢谢您的unix代码。我把它作为一个*.sh脚本附上,它运行得非常漂亮。我在一个有1.52亿行的文件上测试了这个脚本,看起来确实需要一段时间才能运行。因为我是unix新手,所以无法解析您的代码。我理解了awk的第一部分,您正在寻找以“fixedStep”开头的行。你能给初学者解释一下它是如何工作的吗?还有没有办法检查输出是否正确?再次感谢…我补充了一个解释。如果速度太慢,请注意有几个可能存在速度差异。我会尝试至少是声称是快(虽然我自己没有做任何测量)。而且,它不是一个shell脚本,它是一个awk脚本!但是你给文件取什么名字并不重要。
ZZ <- textConnection("fixedStep chrom=chr7 start=10239 step=1
0.064
0.076
fixedStep chrom=chr7 start=10262 step=1
0.076
0.089
fixedStep chrom=chr7 start=10398 step=1
0.045
0.089
")

> ReadFile(ZZ)
     ID value
1 10239 0.064
2 10240 0.076
3 10262 0.076
4 10263 0.089
5 10398 0.045
6 10399 0.089