r - R - 在保持记录顺序的同时对列表进行重复数据删除
问题描述
我有关于一系列事件的数据,并且想检查这些变化,所以我并不真正关心相同事件的重复。
这就是我所拥有的:
ID Date Item
1 1-Jan-19 A
1 5-Jan-19 A
1 8-Jan-19 B
1 15-Jan-19 A
2 1-Jan-19 A
2 5-Jan-19 A
2 8-Jan-19 B
2 15-Jan-19 B
3 1-Jan-19 B
3 5-Jan-19 A
3 8-Jan-19 B
3 15-Jan-19 A
4 1-Jan-19 A
4 5-Jan-19 A
4 8-Jan-19 A
4 15-Jan-19 B
由此,我想要的是:
ID Sequence
1 ABA
2 AB
3 BABA
4 AB
使用 tidyverse 我能够将所有内容放入一个列表/变量中,但我无法弄清楚如何在该步骤或单个步骤中删除重复列表。为了把它变成一个变量,我使用了 mutate、group_by 和 paste0,代码如下。
任何帮助表示赞赏。
#create fake data
have = cbind(
c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
c(43466, 43470, 43473, 43480, 43466, 43470, 43473, 43480, 43466, 43470, 43473, 43480, 43466, 43470, 43473, 43480),
c("A", "A", "B", "A", "A", "A", "B", "B", "B", "A", "B", "A", "A", "A", "A", "B")
)
#add names
names(have) = c("ID", "Date", "Value")
#convert to tibble
have = as_tibble(have)
#current non-working solution
want <- have %>%
group_by(V1) %>%
mutate(Order = paste0(V3, collapse = "|"))
解决方案
在这里,我们可以先filter
根据第一列分组后duplicates
的rleid
第三列,然后再做paste/str_c
library(dplyr)
library(stringr)
library(data.table)
have %>%
group_by(V1) %>%
filter(!duplicated(rleid(V3))) %>%
summarise(Sequence = str_c(V3, collapse=""))
# A tibble: 4 x 2
# V1 Sequence
# <chr> <chr>
#1 1 ABA
#2 2 AB
#3 3 BABA
#4 4 AB
对于首先显示的数据,将“V1”、“V3”替换为“ID”、“Item”
df1 %>%
group_by(ID) %>%
filter(!duplicated(rleid(Item))) %>%
summarise(Sequence = str_c(Item, collapse=""))
推荐阅读
- javascript - 为什么我的 MoveZeroes 代码不修改输入数组?
- python - 逐像素循环以计算图像熵的更快方法
- node.js - Stripe API v3:何时使用 Invoice 与 PaymentIntent(Node SDK)
- mysql - 通过非主键值分析在多个表中插入值
- ruby-on-rails - 如何建模一个简单的事件提醒应用程序?
- react-native - React Native 中的雷达图
- c# - 使用 SeriLog 将 SpecFLow 的测试输出记录到 CSV 文件
- xamarin - 将 T 类型发送到带有对象实例的方法
- amazon-s3 - S3 存储桶上的 CORS
- java - 如何使用正则表达式确定单词中的音节