我有两个表,第一个表 (T1) 表示数字范围,第二个表 (T2) 包括坐标和分数,这是 T1 第一列的分割。
我想计算 T2 的 score
的平均值,并根据范围插入 T1,如果相应的坐标不可用,则放入 NA
。让我们说:
表 1:(T1)
start end
1000 1100
1300 1390
1530 1610
1800 1905
表 2:(T2)
coordinate score
1002 3
1004 1
1020 5
1087 4
1550 1
1559 7
1609 3
1805 2.5
结果:T1 范围内的 T2 元素的平均:ex: 1000 to 1100 (3+1+5+1)/4
并且在1300 to 1390
之间没有得分code> 其中放置 NA
值等等。
start end mean-score
1000 1100 3.25
1300 1390 NA
1530 1610 3.66
1800 1905 2.5
你能帮我在 R 中实现它吗?
谢谢。
最佳答案
在@akrun 的提示下,我在“data.table”中遇到了 foverlaps
函数。如果这是最好的方法,我不肯定(但它有效:-))
library(data.table)
T1 <- as.data.table(T1)
T2 <- as.data.table(T2)
setkey(T1, start, end)
T2[, c("start", "end") := coordinate]
foverlaps(T2, T1)[, list(score = mean(score)), by = list(start, end)]
# start end score
# 1: 1000 1100 3.250000
# 2: 1530 1610 3.666667
# 3: 1800 1905 2.500000
更新:
正如@Arun 在评论中提到的,如果您在 T2 上也设置了 Key,并更改了 foverlaps
的顺序,您可以获得 NA
为好吧。
setkey(T2, start, end)
foverlaps(T1, T2)[, list(mean = mean(score)), by = list(i.start, i.end)]
# i.start i.end mean
# 1: 1000 1100 3.250000
# 2: 1300 1390 NA
# 3: 1530 1610 3.666667
# 4: 1800 1905 2.500000
关于r - 比较两个表的元素,平均现有元素并将 NA 保留为 R 中不存在的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26483384/