我有关于一系列事件的数据,并想检查更改,因此我并不真正关心相同事件的重复。
这就是我所拥有的:
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
Run Code Online (Sandbox Code Playgroud)
由此,我想要的是:
ID Sequence
1 ABA
2 AB
3 BABA
4 AB
Run Code Online (Sandbox Code Playgroud)
使用 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 = "|"))
Run Code Online (Sandbox Code Playgroud)
在这里,我们可以先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
Run Code Online (Sandbox Code Playgroud)
对于首先显示的数据,将“V1”、“V3”替换为“ID”、“Item”
df1 %>%
group_by(ID) %>%
filter(!duplicated(rleid(Item))) %>%
summarise(Sequence = str_c(Item, collapse=""))
Run Code Online (Sandbox Code Playgroud)