r - 在 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)
解决方案
您可以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
推荐阅读
- java - 如何使用 Spring Boot 应用程序初始化 log4j?
- typescript - 从 React Native 过渡到 Flutter 时最重要的方面
- java - 如何在 javafx 多文件选择器中维护选定文件的顺序
- vue.js - v-treeview展开折叠实现
- r - 在 R 中解释夏皮罗威尔克测试
- c# - Fluent Validation 从不适用于任何条件 MVC 5
- curl - 使用 cygwin 和 curl 使用 crontab 将文件上传到 ftp
- ios - Xcode11:无法安装“AppName”
- python - 如何改进这个预测给定数字是奇数还是偶数的 Keras 模型
- javascript - 如何在表单验证中显示角度模板中的元素?