r - 按组选择每次运行的第一行
问题描述
我有一个分组变量(ID)和一些值(类型)的数据:
ID <- c("1", "1", "1", "1", "2", "2", "2", "2", "3", "3", "3", "3")
type <- c("1", "3", "3", "2", "3", "3", "1", "1", "1", "2", "2", "1")
dat <- data.frame(ID,type)
在每个 ID 中,我想删除重复的数字,不是唯一的,而是与前一个相同的。我注释了一些例子:
# ID type
# 1 1 1
# 2 1 3 # first value in a run of 3s within ID 1: keep
# 3 1 3 # 2nd value: remove
# 4 1 2
# 5 2 3
# 6 2 3
# 7 2 1
# 8 2 1
# 9 3 1
# 10 3 2 # first value in a run of 2s within ID 3: keep
# 11 3 2 # 2nd value: remove
# 12 3 1
例如,ID 3 的值序列为 1,2,2,1。第三个值与第二个值相同,所以应该删除它,变成 1,2,1
因此,所需的输出是:
data.frame(ID = c("1", "1", "1", "2", "2", "3", "3", "3"),
type = c("1", "3", "2", "3", "1", "1", "2", "1"))
ID type
1 1 1
2 1 3
3 1 2
4 2 3
5 2 1
6 3 1
7 3 2
8 3 1
我试过了
df[!duplicated(df), ]
但是我得到的是
ID <- c("1", "1", "1", "2", "2", "3", "3")
type<- c("1", "3", "2", "3", "1", "1", "2")
我知道重复只会保留唯一的。我怎样才能得到我想要的值?
我在这里先向您的帮助表示感谢!
解决方案
这是否有效:
library(dplyr)
dat %>% group_by(ID) %>%
mutate(flag = case_when(type == lag(type) ~ TRUE, TRUE ~ FALSE)) %>%
filter(!flag) %>% select(-flag)
# A tibble: 8 x 2
# Groups: ID [3]
ID type
<chr> <chr>
1 1 1
2 1 3
3 1 2
4 2 3
5 2 1
6 3 1
7 3 2
8 3 1
推荐阅读
- linux - 如何在自定义路径中安装 elasticsearch?
- node.js - 如何在heroku中有超过30秒的响应超时
- node.js - 基于多个文件静态生成类型文件
- python - pyomo在定义目标函数时可以处理分割函数(由numpy定义)吗?
- c++ - 如何在 c++ 中使用 cout 中的录音
- python - 每次调用 train.dataset 时输入数字都会增加
- docker - 是否将 Nextcloud 的最佳选择列入白名单
- javascript - 带有 Apple Pen 的 HTML5 Canvas - 仅适用于 (position: absolute;)
- r - r boot.ci 间隔更多小数
- python - 从具有多个列名的数据框中提取值