R,dplyr : cumulative version of n_distinct

标签 r dplyr cumsum

我有一个数据框如下。按time列排序。

输入 -

df = data.frame(time = 1:20,
            grp = sort(rep(1:5,4)),
            var1 = rep(c('A','B'),10)
            )

head(df,10)
   time grp var1
1   1   1    A
2   2   1    B
3   3   1    A
4   4   1    B
5   5   2    A
6   6   2    B
7   7   2    A
8   8   2    B
9   9   3    A
10 10   3    B

我想创建另一个变量var2,到目前为止,该变量没有计算出任何不同的var1值,即直到time中的每个点grp为止。这与我使用n_distinct会得到的有点不同。

预期产量-
   time grp var1 var2
1   1   1    A    1
2   2   1    B    2
3   3   1    A    2
4   4   1    B    2
5   5   2    A    1
6   6   2    B    2
7   7   2    A    2
8   8   2    B    2
9   9   3    A    1
10 10   3    B    2

我想为此创建一个说cum_n_distinct的函数,并将其用作-
d_out = df %>%
  arrange(time) %>%
  group_by(grp) %>%
  mutate(var2 = cum_n_distinct(var1))

最佳答案

假设东西已经由time排序,则首先定义一个累积的不同函数:

dist_cum <- function(var)
  sapply(seq_along(var), function(x) length(unique(head(var, x))))

然后使用ave创建组的基本解决方案(请注意,假定var1是因素),然后将我们的函数应用于每个组:
transform(df, var2=ave(as.integer(var1), grp, FUN=dist_cum))
data.table解决方案,基本上可以完成相同的操作:
library(data.table)
(data.table(df)[, var2:=dist_cum(var1), by=grp])

同样,dplyr,也是一样:
library(dplyr)
df %>% group_by(grp) %>% mutate(var2=dist_cum(var1))

关于R,dplyr : cumulative version of n_distinct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25553099/

相关文章:

python - 如何计算在数据框python中的特定值之前出现的次数?

r - 优化/并行化 R - 处理在 R 中计算 SPI 的大数据集

list - 合并(合并)不同长度的向量

r - case_when & %in%

R - 如何过滤掉具有唯一标识符的重复数据?

python - 枢轴数据框上的 Pandas cumsum

R Shiny 在不同进程中运行任务/脚本

r - 将经/纬度转换为邮政编码/社区名称

r - R 数据帧中的增量 ID

python - numpy cumsum 函数的反函数是什么?