Mak*_*oni 6 r rollover count rollapply data.table
想象一下,我有一个数字列表(即 data.table/data.frame 中的数字列)。
1
5
5
10
11
12
Run Code Online (Sandbox Code Playgroud)
对于列表中的每个数字,想要计算有多少个唯一数字低于该特定数字 + 5。
大写的解释,第一个数字=1,搜索范围是1+5=6,所以三个数字在范围内,小于或等于:c(1,5,5),然后count unique是2。这都是假设我们有附加条件,该数字不仅必须小于 current_number + 5,而且其在列表中的索引必须 >= current_number 的索引。
在这种情况下,结果将是:
2
2
2
3
2
1
Run Code Online (Sandbox Code Playgroud)
注意:在data.frame或data.table 中是否有针对庞大数据集的快速解决方案?我的数据集相当大,有 10+M 行。
我在基本 R 中能想到的最快方法(如果x已排序则有效):
findInterval(x + 5, unique(x)) - cumsum(!duplicated(x)) + 1L
#[1] 2 2 2 3 2 1
Run Code Online (Sandbox Code Playgroud)
编辑:排序没有问题,因为 with data.table,排序整数是微不足道的:
nr <- 1e7
nn <- nr/2
set.seed(0L)
DT <- data.table(X=sample(nn, nr, TRUE))
#DT <- data.table(X=c(1,5,5,10,11,12))
system.time(
DT[order(X),
COUNT := findInterval(X + 5L, unique(X)) - cumsum(!duplicated(X)) + 1L
]
)
# user system elapsed
# 1.73 0.17 1.53
Run Code Online (Sandbox Code Playgroud)
2 秒表示 1000 万行。
尝试这个:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |