r - 选择数据集中的第一个、最后一个和单个观察值
问题描述
有没有办法保持一个组的第一个和最后一个观察值(此处为 id1),以及具有单个观察值的组?
例如,如果我有:
id1 id2
#1 1 1
#2 2 2
#3 2 3
#4 2 4
#5 2 5
#6 3 6
#7 3 7
#8 3 8
#9 4 9
#10 5 10
#11 5 11
#12 5 12
我想要:
id1 id2
#1 1 1
#2 2 2
#3 2 5
#4 3 6
#5 3 8
#6 4 9
#7 5 10
#8 5 12
我尝试使用 dplyr group by id1 然后对第一行和最后一行进行切片,但它重复了我的单个观察结果。
对于奖励积分,我有另一个二进制变量,当这个变量==1时,我只想保留第一个和最后一个观察值:
id1 id2 binary
#1 1 1 1
#2 2 2 1
#3 2 3 1
#4 2 4 1
#5 2 5 1
#6 3 6 0
#7 3 7 0
#8 3 8 0
#9 4 9 1
#10 5 10 1
#11 5 11 1
#12 5 12 1
我想要:
id1 id2 binary
#1 1 1 1
#2 2 2 1
#5 2 5 1
#6 3 6 0
#7 3 7 0
#8 3 8 0
#9 4 9 1
#10 5 10 1
#12 5 12 1
谢谢!
解决方案
我认为这应该适合你:
library(dplyr)
df <- tibble(
id1 = c(1,2,2,2,2,3,3,3,4,5,5,5),
id2 = 1:12,
binary = c(1,1,1,1,1,0,0,0,1,1,1,1)
)
df %>%
group_by(id1) %>%
filter(
# binary == 1, # uncomment this for bonus points :)
row_number() == 1 | row_number() == n()
) %>%
ungroup()
我row_number()
正在检查一个按组递增的序列,以仅保留那些是第一个 ( row_number() == 1
)或组中最后一个元素的行 ( row_number() == n()
,其中n()
为您提供每组中的观察次数)。
我相信有更优雅或计算效率更高的解决方案,但这至少应该可以解决问题。
推荐阅读
- jhipster - 如何解密存储在数据库中并由 jhipster web-app 生成的密码?
- ruby-on-rails - Rails + GraphQl + Rspec
- ruby-on-rails - Kubernetes readinessProbe 返回“连接拒绝”
- python - 如何将文件文件夹移动到可变名称文件夹
- sql - 在 AWS Athena 中减去两个时间戳列
- node.js - 用一个后端 Nodejs 运行两个源前端 Reactjs
- asp.net-core - 使用当前版本的 System.Text.Json.JsonSerializer 序列化 DataSet
- php - laravel 使用 ajax 重定向
- ios - 带有 Parse 平台的 iOS 推送通知 - didRegisterForRemoteNotificationsWithDeviceToken - 从未调用
- java - 使用存储过程从输入 csv 文件将多个表创建到 oracle 数据库中