当前位置: 首页 > 知识库问答 >
问题:

使用dplyr过滤包含部分列字符串的行

杜辉
2023-03-14

假设我有一个像

term     cnt
apple     10
apples     5
a apple on 3
blue pears 3
pears      1

如何筛选此列中所有部分找到的字符串,例如获取结果

term     cnt
apple     10
pears      1

没有指出我想过滤哪些术语(苹果|梨),而是通过自我引用的方式(即它确实根据整列检查每个术语,并删除部分匹配的术语)。令牌的数量不受限制,字符串的一致性也不受限制(即“苹果”将与“苹果”匹配)。这将导致基于dplyr的反向广义版本

d[grep("^apple$|^pears$", d$term), ]

此外,使用这种分离来获得累计金额会很有趣,例如。

term     cnt
apple     18
pears      4

我无法让它与包含()或grep()一起工作。

谢啦

共有3个答案

尉迟跃
2023-03-14

试试这个:

df=data.frame(term=c('apple','apples','a apple on','blue pears','pears'),cnt=c(10,5,3,3,1))

matches = sapply(df$term,function(t,terms){grepl(pattern = t,x = terms)},df$term)

sapply(1:ncol(matches),function(t,mat){
  tempmat = mat[,t]&mat[,-t]
  indices=unlist(apply(tempmat,MARGIN = 2,which))
  df$term[indices]<<-df$term[t]
 },matches)

df%>%group_by(term)%>%summarize(cnt=sum(cnt))

 # A tibble: 2 x 2
 #  term   cnt
 #  <chr> <dbl>
 #1 apple    18
 #2 pears     4  
慕学海
2023-03-14

您可以尝试使用tidyverse类似的东西

1. define a list of the words as:

     k <- dft %>% 
          select(term) %>% 
          unlist() %>% 
          unique()

2. operate on the data as:

    dft %>%
      separate(term, c('t1', 't2')) %>%
      rowwise() %>%
      mutate( g = sum(t1 %in% k)) %>%
      filter( g > 0) %>%
      select(t1, cnt)

其中:

      t1   cnt
   <chr> <int>
1  apple    10
2 apples     5
3  pears     1

不过,这仍然不能处理appleapple。我会继续尝试的。

钱建本
2023-03-14

希望答案是完整的。不是很地道(如Pythonista所说),但有人可以建议对此进行改进:

> ssss <- data.frame(c('apple','red apple','apples','pears','blue pears'),c(15,3,10,4,3))
> 
> names(ssss) <- c('Fruit','Count')
> 
> ssss
       Fruit Count
1      apple    15
2  red apple     3
3     apples    10
4      pears     4
5 blue pears     3
> 
> root_list <- as.vector(ssss$Fruit[unlist(lapply(ssss$Fruit,function(x){length(grep(x,ssss$Fruit))>1}))])
> 
> 
> ssss %>% filter(ssss$Fruit %in% root_list)
  Fruit Count
1 apple    15
2 pears     4
> 
> data <- data.frame(lapply(root_list, function(x){y <- stringr::str_extract(ssss$Fruit,x); ifelse(is.na(y),'',y)}))
> 
> cols <- colnames(data)
> 
> #data$x <- do.call(paste0, c(data[cols]))
> #for (co in cols) data[co] <- NULL
> 
> ssss$Fruit <- do.call(paste0, c(data[cols]))
> 
> ssss %>% group_by(Fruit) %>% summarise(val = sum(Count))
# A tibble: 2 x 2
  Fruit   val
  <chr> <dbl>
1 apple    28
2 pears     7
> 
 类似资料:
  • 我当前的代码只删除具有“未分配”确切值的值,而我希望它删除任何包含“未分配”的值。 这是我的密码 我希望从中删除任何“未分配”值的列称为taxon。 谢谢!

  • 问题内容: 我想为站点seo写一个比较过程(t-sql)。 我有一个表,其中包含字段url的一部分的字段“ url”(nvarchar())。例如:“ _mysyte.com/?id=2_ ”。每个URL的此表还包含我需要提取的元数据。 主要问题是网站上的完整url看起来像是“ _mysyte.com/?id=2®ion=0 &page=1_ ”,我只需要忽略一切,除了表中的url: 我的意思是:

  • 两行的一个例子是:([a,b,c],d)和([d,e],a)我想把这些行转换成([a,b,c],[d,e])和([d,e],[a,b,c]) dataframe的列名是“src”和“dst”。 我如何处理这个问题?

  • 本文向大家介绍如何过滤R中包含某个字符串的行?,包括了如何过滤R中包含某个字符串的行?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过使用dplyr包的filter和grepl函数来做到这一点。 示例 考虑mtcars数据集。 假设我们要过滤类型为Ferrari的行,则可以按以下步骤进行操作- 现在,如果要过滤类型为Merc或Datsun的行,则可以按以下步骤进行操作- 假设如果要过滤没有M

  • 本文向大家介绍如何使用dplyr从R数据框中过滤某些字符串的列值?,包括了如何使用dplyr从R数据框中过滤某些字符串的列值?的使用技巧和注意事项,需要的朋友参考一下 筛选数据可以帮助我们制作所需的数据组,而不是将其进一步用于分析。这样,可以实现精度并且计算变得容易。假设我们有一个同质组,然后根据某些特征对该组进行分区,则可以使用dplyr包的过滤功能。 示例 请看以下数据帧- 加载dplyr软件

  • 问题内容: 说我有一个ArrayList: 我希望在我说arrayList.containsSubString(’string1’);时返回arrayList的第一个元素。除了遍历元素的每个元素并检查该元素字符串的子字符串之外,该如何做? 问题答案: 我能想到的唯一方法是执行以下操作: 虽然不知道这是否被认为是好的做法。