使用 R 根据特定列中的后缀过滤行

Filtering rows based on suffixes in specific column using R

我有一个大数据框,如下所示:

Din <- c ('test','test_p3_v1','test_p1_v2','test_p1','test_p3_v1','test','test_p2_v3','test_p1_v3','test_p2','test')
Elf <- c ('cat','tiger','mouse','dog','zebra','fish','snake','lion','bird','parrot')
data<- data.frame(Din,Elf)

并且我想扫描 'Din' 列中的每一行,如果其中任何一个名称的后缀中有 'v' 单词,则只保留那些有 'v1' 的名称而不删除任何其他后缀中根本没有 'v' 的人。

我想要这样的输出:

Din_new <- c ('test','test_p3_v1','test_p1','test_p3_v1','test','test_p2','test')
Elf_new <- c ('cat','tiger','dog','zebra','fish','bird','parrot')
data_new<- data.frame(Din_new,Elf_new)

您可以使用 grepl 在逻辑上包含或排除任何匹配的字符串。所以你可以这样说"give me strings that have no '_v' in them OR that have a '_v1' in them."

data_new <- data[!grepl("_v", Din) |  grepl("_v1", Din),]

data_new
#>           Din    Elf
#> 1        test    cat
#> 2  test_p3_v1  tiger
#> 4     test_p1    dog
#> 5  test_p3_v1  zebra
#> 6        test   fish
#> 9     test_p2   bird
#> 10       test parrot

您可以这样使用 separate

library(tidyverse)

data %>%
  mutate(Din2 = Din) %>%
  separate(Din2, into = c ("Din2", "Version1","Version2")) %>%
  filter(Version2 == "v1" | is.na(Version2)) %>%
  select(Din,Elf)