首页 > 解决方案 > 根据R中的单词序列保留数据帧的特定行

问题描述

我有一个这样的数据框(df)。我想要做的是检查每个 ID 的值,如果有两个以相同单词开头的字符串,我想比较它们以保持不同的值。

df <- data.frame(id = c(1,1,2,3,3,4,4,4,4,5), 
                 value = c('australia', 'australia sydney', 'brazil',
                           'australia', 'usa', 'australia sydney', 'australia sydney randwick', 'australia', 'australia sydney circular quay', 'australia sydney'))

我想获取第一个词来比较它们,如果它们不同,则保留两者,但如果它们相同,则转到第二个词来比较它们,依此类推......所以对于 ID 1,我想将行与值“澳大利亚悉尼”,对于 ID 4,我想保留“澳大利亚悉尼圆形码头”和“澳大利亚悉尼兰德威克”。对于此示例,我需要获取行 2:5、7、9,10

预期产出

标签: rregextext

解决方案


根据您的编辑,您可以在组内检查是否有任何条目与任何其他条目的开头匹配,并删除符合以下条件的条目:

library(tidyverse)

df %>%
  group_by(id) %>%
  filter(!map_lgl(seq_along(value), ~ any(if (length(value) == 1) FALSE else str_detect(value[-.x], paste0("^", value[.x])))))

# A tibble: 7 x 2
# Groups:   id, value [7]
     id value                         
  <dbl> <chr>                         
1     1 australia sydney              
2     2 brazil                        
3     3 australia                     
4     3 usa                           
5     4 australia sydney randwick     
6     4 australia sydney circular quay
7     5 australia sydney  

推荐阅读