过滤R

时间:2017-02-22 10:43:07

标签: r string filter

我在过滤字符串中的重复元素时遇到了一些问题。我的数据与此类似:

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,使用一个变量来表示许多不同的数字。

3 个答案:

答案 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