【发布时间】:2023-04-06 01:17:02
【问题描述】:
数据文件中有两个数字列。我需要按第一列的间隔(例如100)计算第二列的平均值。
我可以在 R 中编写这个任务,但是对于相对较大的数据文件(数百万行,第一列的值在 1 到 33132539 之间变化),我的 R 代码确实很慢。
这里我展示了我的 R 代码。我怎样才能把它调得更快?其他基于 perl、python、awk 或 shell 的解决方案表示赞赏。
提前致谢。
(1) 我的数据文件(制表符分隔,数百万行)
5380 30.07383\n
5390 30.87\n
5393 0.07383\n
5404 6\n
5428 30.07383\n
5437 1\n
5440 9\n
5443 30.07383\n
5459 6\n
5463 30.07383\n
5480 7\n
5521 30.07383\n
5538 0\n
5584 20\n
5673 30.07383\n
5720 30.07383\n
5841 3\n
5880 30.07383\n
5913 4\n
5958 30.07383\n
(2) 我想要得到的,这里的间隔 = 100
intervals_of_first_columns, average_of_2nd column_by_the_interval
100, 0\n
200, 0\n
300, 20.34074\n
400, 14.90325\n
.....
(3)R代码
chr1 <- 33132539 # set the limit for the interval
window <- 100 # set the size of interval
spe <- read.table("my_data_file", header=F) # read my data in
names(spe) <- c("pos", "rho") # name my data
interval.chr1 <- data.frame(pos=seq(0, chr1, window)) # setup intervals
meanrho.chr1 <- NULL # object for the mean I want to get
# real calculation, really slow on my own data.
for(i in 1:nrow(interval.chr1)){
count.sub<-subset(spe, chrom==1 & pos>=interval.chr1$pos[i] & pos<=interval.chr1$pos[i+1])
meanrho.chr1[i]<-mean(count.sub$rho)
}
【问题讨论】:
-
请定义“第一列的间隔(如100)”。目前尚不清楚“100”是什么意思。这不是前 100 行。因此,也许您的意思是从初始值(5380 到 5480)具有 100 值的行。无论“第一列的间隔”的定义是什么,用文字写下该定义都会有很大帮助。不是每个人都会读 R。
-
同意 S.Lott。我不知道 R,也看不到给定输入和给定输出之间的关系。这是您期望从该输入获得的输出吗?
-
这是一个数值区间,例如第一列>= 1和=101 和 200 应该是 101 到 200 的区间,然后继续。并且,应该对归类到由第一列定义的不同间隔的行中的第二列中的所有值进行平均。我想要这些平均值对应于这样的间隔。感谢 S. Lott 和 Bill Ruppert 的回复。
-
将
meanrho.chr1 <- NULL更改为meanrho.chr1 <- numeric(nrow(interval.chr1))应该会显着加快速度。这称为预分配。
标签: python perl r awk data.table