从r中的当前数字开始减去常数的数字

问题描述 投票:-1回答:3

想象一下我有一个数字列表(即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行。谢谢!

编辑:较高->较低

r count data.table rollover rollapply
3个回答
2
投票

尝试一下:

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

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")

0
投票
sapply(yourVector + 5, function(x, y) sum(x > y), y = unique(x))
© www.soinside.com 2019 - 2024. All rights reserved.