2017-02-22 31 views
0

У меня возникли проблемы с фильтрацией для повторяющихся элементов в строке. Мои данные выглядят примерно так:Фильтрация Строки, соответствующие строкам в R

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 

У меня есть столбец, содержащий уникальный идентификатор и столбец, содержащий путь для веб-страницы навигации. Правый столбец содержит некоторые случаи, когда страницы были доступны дважды или чаще, но между этими обращениями находятся несколько разных страниц. Я просто хочу фильтровать() строки, где страницы встречаются дважды или чаще, и по крайней мере одна страница находится в двух вариантах доступа, поэтому данные должны выглядеть так.

idvisit  path 
1   1,16,23,59,16 
2   2,14,19,14 
5   23,27,29,23 

Я просто хочу удалить строки, соответствующие условиям. Я действительно не знаю, как обрабатывать String с использованием переменной для множества разных чисел.

ответ

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 
+0

Это работает отлично! Большое спасибо :) У вас есть полезная ссылка, что я могу узнать больше об этом струнном материале? я много искал в Интернете, но не нашел полезных советов по моей проблеме? –

+0

Ну, большинство из того, что я узнал, я узнал отсюда, чтобы быть честным – Sotos

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

Это не заботиться о ситуации, когда существует то же страница дважды , но никакой другой страницы между – ira

+0

@ira Обновлено сообщение – akrun

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