想象一下我有一个数字列表(即data.table / data.frame中的数字列)。
1
5
5
10
11
12
对于列表中的每个数字,要计算有多少个唯一数字比该特定数字下 + 5。大写的解释是,第一个数字= 1,搜索范围是1 + 5 = 6,因此三个数字在(1,5,5)范围内,然后计数唯一= 2。
在这种情况下的结果将是:
2
2
2
3
2
1
在data.frame或data.table中是否有针对大型数据集的快速解决方案?我的数据集非常大,有10 + M行。谢谢!
编辑:较高->较低
尝试一下:
x <- c(1,5,5,10,11,12)
sapply(seq_along(x), function(i)
sum(unique(x[i:length(x)]) <= (x[i] + 5)))
# [1] 2 2 2 3 2 1
一个选项是使用SQL自连接
library(sqldf)
df$r <- seq(nrow(df))
sqldf('
select a.V1
, count(distinct b.V1) as n
from df a
left join df b
on b.V1 <= a.V1 + 5
and b.r >= a.r
group by a.r
')
# V1 n
# 1 1 2
# 2 5 2
# 3 5 2
# 4 10 3
# 5 11 2
# 6 12 1
使用的数据:
df <- structure(list(V1 = c(1L, 5L, 5L, 10L, 11L, 12L)), row.names = c(NA,
-6L), class = "data.frame")
sapply(yourVector + 5, function(x, y) sum(x > y), y = unique(x))