【问题标题】:Filtering Rows matching String condition in R在R中过滤匹配字符串条件的行
【发布时间】:2017-02-22 10:43:07
【问题描述】:

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

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

我只想删除符合条件的行。我真的不知道如何使用变量来处理许多不同数字的字符串。

【问题讨论】:

    标签: r string filter


    【解决方案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】:

    我们可以试试

    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))
    

    【讨论】:

    • 不处理两次相同页面但中间没有其他页面的情况
    • @ira 更新了帖子
    【解决方案3】:

    您也可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      相关资源
      最近更新 更多