首页 > 解决方案 > 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 = "|")) 

标签: rtidyverse

解决方案


在这里,我们可以先filter根据第一列分组后duplicatesrleid第三列,然后再做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=""))

推荐阅读