删除 r 中的相邻重复项
remove adjacent duplicates in r
我有一个格式的数据框:
site_domain <- c('ebay.com','facebook.com','facebook.com','ebay.com','ebay.com','auto.com','ebay.com','facebook.com','auto.com','ebay.com','facebook.com','facebook.com','ebay.com','facebook.com','auto.com','auto.com')
id <- c(1, 1, 1,2,2,3,3,3,3,4,4,4,5,5,5,5)
file0 <- as.data.frame(cbind(site_domain,id))
我在 "id" 上进行了分组以获取数据:
library(dplyr)
xx <- as.data.frame(file0 %>%
group_by(id) %>%
summarise(pages=paste(site_domain, collapse='_')))
数据如下:
1 ebay.com_facebook.com_facebook.com
2 ebay.com_ebay.com
3 auto.com_ebay.com_facebook.com_auto.com
4 ebay.com_facebook.com_facebook.com
5 ebay.com_facebook.com_auto.com_auto.com
但是我想删除相邻的重复项,所以我想像这样:
1 ebay.com_facebook.com
2 ebay.com
3 auto.com_ebay.com_facebook.com_auto.com
4 ebay.com_facebook.com
5 ebay.com_facebook.com_auto.com
我怎样才能做到这一点。
具有unique
功能:
xx <- as.data.frame(file0 %>%
group_by(id) %>%
summarise(pages=paste(unique(site_domain), collapse='_')))
xx
# id pages
#1 1 ebay.com_facebook.com
#2 2 ebay.com
#3 3 auto.com_ebay.com_facebook.com
#4 4 ebay.com_facebook.com
#5 5 ebay.com_facebook.com_auto.com
分组前去重很容易
file0 <- file0 [!duplicated(file0),]
site_domain id
1 ebay.com 1
2 facebook.com 1
4 ebay.com 2
6 auto.com 3
7 ebay.com 3
8 facebook.com 3
10 ebay.com 4
11 facebook.com 4
13 ebay.com 5
14 facebook.com 5
15 auto.com 5
然后你可以按id分组数据
id pages
1 1 ebay.com_facebook.com
2 2 ebay.com
3 3 auto.com_ebay.com_facebook.com
4 4 ebay.com_facebook.com
5 5 ebay.com_facebook.com_auto.com
我们可以使用 values
属性 of rle
来删除相邻的重复项。
library(dplyr)
file0 %>%
group_by(id) %>%
summarise(pages=paste(rle(as.character(site_domain))$values, collapse='_'))
# id pages
# <fctr> <chr>
#1 1 ebay.com_facebook.com
#2 2 ebay.com
#3 3 auto.com_ebay.com_facebook.com_auto.com
#4 4 ebay.com_facebook.com
#5 5 ebay.com_facebook.com_auto.com
这里有一个选项data.table
library(data.table)
setDT(file0)[, unique(site_domain), by= .(id, grp=rleid(site_domain))
][, .(site=paste(V1, collapse="_")) , id]
# id site
#1: 1 ebay.com_facebook.com
#2: 2 ebay.com
#3: 3 auto.com_ebay.com_facebook.com_auto.com
#4: 4 ebay.com_facebook.com
#5: 5 ebay.com_facebook.com_auto.com
或者使用 .I
创建索引,提取行,然后通过 'id'
paste
i1 <- setDT(file0)[, .I[!duplicated(site_domain)], .(id, grp = rleid(site_domain))]$V1
file0[i1, .(site = paste(site_domain, collapse="_")), by = id]
我有一个格式的数据框:
site_domain <- c('ebay.com','facebook.com','facebook.com','ebay.com','ebay.com','auto.com','ebay.com','facebook.com','auto.com','ebay.com','facebook.com','facebook.com','ebay.com','facebook.com','auto.com','auto.com')
id <- c(1, 1, 1,2,2,3,3,3,3,4,4,4,5,5,5,5)
file0 <- as.data.frame(cbind(site_domain,id))
我在 "id" 上进行了分组以获取数据:
library(dplyr)
xx <- as.data.frame(file0 %>%
group_by(id) %>%
summarise(pages=paste(site_domain, collapse='_')))
数据如下:
1 ebay.com_facebook.com_facebook.com
2 ebay.com_ebay.com
3 auto.com_ebay.com_facebook.com_auto.com
4 ebay.com_facebook.com_facebook.com
5 ebay.com_facebook.com_auto.com_auto.com
但是我想删除相邻的重复项,所以我想像这样:
1 ebay.com_facebook.com
2 ebay.com
3 auto.com_ebay.com_facebook.com_auto.com
4 ebay.com_facebook.com
5 ebay.com_facebook.com_auto.com
我怎样才能做到这一点。
具有unique
功能:
xx <- as.data.frame(file0 %>%
group_by(id) %>%
summarise(pages=paste(unique(site_domain), collapse='_')))
xx
# id pages
#1 1 ebay.com_facebook.com
#2 2 ebay.com
#3 3 auto.com_ebay.com_facebook.com
#4 4 ebay.com_facebook.com
#5 5 ebay.com_facebook.com_auto.com
分组前去重很容易
file0 <- file0 [!duplicated(file0),]
site_domain id
1 ebay.com 1
2 facebook.com 1
4 ebay.com 2
6 auto.com 3
7 ebay.com 3
8 facebook.com 3
10 ebay.com 4
11 facebook.com 4
13 ebay.com 5
14 facebook.com 5
15 auto.com 5
然后你可以按id分组数据
id pages
1 1 ebay.com_facebook.com
2 2 ebay.com
3 3 auto.com_ebay.com_facebook.com
4 4 ebay.com_facebook.com
5 5 ebay.com_facebook.com_auto.com
我们可以使用 values
属性 of rle
来删除相邻的重复项。
library(dplyr)
file0 %>%
group_by(id) %>%
summarise(pages=paste(rle(as.character(site_domain))$values, collapse='_'))
# id pages
# <fctr> <chr>
#1 1 ebay.com_facebook.com
#2 2 ebay.com
#3 3 auto.com_ebay.com_facebook.com_auto.com
#4 4 ebay.com_facebook.com
#5 5 ebay.com_facebook.com_auto.com
这里有一个选项data.table
library(data.table)
setDT(file0)[, unique(site_domain), by= .(id, grp=rleid(site_domain))
][, .(site=paste(V1, collapse="_")) , id]
# id site
#1: 1 ebay.com_facebook.com
#2: 2 ebay.com
#3: 3 auto.com_ebay.com_facebook.com_auto.com
#4: 4 ebay.com_facebook.com
#5: 5 ebay.com_facebook.com_auto.com
或者使用 .I
创建索引,提取行,然后通过 'id'
paste
i1 <- setDT(file0)[, .I[!duplicated(site_domain)], .(id, grp = rleid(site_domain))]$V1
file0[i1, .(site = paste(site_domain, collapse="_")), by = id]