我在过滤字符串中的重复元素时遇到了一些问题。我的数据与此类似:
idvisit path
1 1,16,23,59,16
2 2,14,19,14
3 5,19,23
4 10,21
5 23,27,29,23
我有一个包含唯一ID的列和一个包含网页导航路径的列。右列包含一些情况,其中页面被访问两次或更多次,但这些访问之间有一些不同的页面。我只想过滤()行,其中页面经常出现两次或更多次,并且两次访问之间至少有一个页面,所以数据看起来应该是这样的。
idvisit path
1 1,16,23,59,16
2 2,14,19,14
5 23,27,29,23
我只想删除符合条件的行。我真的不知道如何处理一个String,使用一个变量来表示许多不同的数字。
答案 0 :(得分:1)
我们可以尝试
library(data.table)
lst <- strsplit(df1$path, ",")
df1[lengths(lst) != sapply(lst, uniqueN),]
# idvisit path
#1 1 1,16,23,59,16
#2 2 2,14,19,14
#5 5 23,27,29,23
使用tidyverse
library(tidyverse)
separate_rows(df1, path) %>%
group_by(idvisit) %>%
filter(n_distinct(path) != n()) %>%
summarise(path = toString(path))
答案 1 :(得分:1)
您可以根据每个字符串中的元素数进行过滤。具有重复条目的字符串将大于其唯一长度,即
df1[sapply(strsplit(as.character(df1$path), ','), function(i) length(unique(i)) != length(i)),]
# idvisit path
#1 1 1,16,23,59,16
#2 2 2,14,19,14
#5 5 23,27,29,23
答案 2 :(得分:0)
您也可以使用grepl
尝试正则表达式:
df[grepl('.*([0-9]+),.*,\\1', as.character(df$path)),]
# idvisit path
#1 1 1,16,23,59,16
#2 2 2,14,19,14
#5 5 23,27,29,23