首页 > 解决方案 > 在 R 中查找每个分组的新观察值

问题描述

我有一个数据框:

id = c('a', 'b', 'a', 'b', 'c', 'a', 'b', 'c', 'd')
period = c(1, 1, 2, 2, 2, 3, 3, 3, 3)
a <- data.frame(period, id); a


  period  id
1      1  a
2      1  b
3      2  a
4      2  b
5      2  c
6      3  a
7      3  b
8      3  c
9      3  d

现在,我想在每个时期找到新的观察结果。所以我这样做,

a_group <- a %>% group_by(period) %>% count(id_count = n())
a_news <- a_group %>% ungroup() %>% 
  mutate(new_vals = id_count - lag(id_count))
a_news

       period id_count n new_vals
   <dbl>    <int> <int>    <int>
1      1        2     2       NA
2      2        3     3        1
3      3        4     4        1

这很好用,因为每个时期都会添加一个新的独特观察。考虑一下,当每个时期的id不唯一时:

id1 = c('a', 'b', 'a', 'b', 'a', 'a', 'b', 'c', 'a')
period1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3)
b <- data.frame(period1, id1); b  

   period1 id1
1       1   a
2       1   b
3       2   a
4       2   b
5       2   a
6       3   a
7       3   b
8       3   c
9       3   a
b_group <- b %>% group_by(period1) %>% count(id1_count = n())
b_news <- b_group %>% ungroup() %>% 
  mutate(new_vals = id1_count - lag(id1_count))

我得到相同的结果a_news

   period1 id1_count     n new_vals        
1       1         2     2       NA
2       2         3     3        1
3       3         4     4        1

事实上,从第 2 期开始,的观察a一点也不新鲜。如何找出每个时期(第 1 时期之后)的新观察次数?因为,在第一阶段当然一切都是新的。

数据帧 b 的预期输出:

period1 new_vals        
1      2
2      0
3      1

在 period1 == 2 中,没有新的观察,在 period1 == 3 中有一个新的观察 (c)

标签: rdplyr

解决方案


您可以Reduce尝试unique

tt <- split(a$id, a$period) #Split id per period
#Find unique id's until period
n <- lengths(Reduce(function(i,j) unique(c(i,j)), tt, accumulate = TRUE))
setNames(diff(c(0,n)), names(tt))
#1 2 3 
#2 1 1 

tt <- split(b$id1, b$period1)
n <- lengths(Reduce(function(i,j) unique(c(i,j)), tt, accumulate = TRUE))
setNames(diff(c(0,n)), names(tt))
#1 2 3 
#2 0 1 

推荐阅读