根据字符串是否包含所述标识符,将新标识符列添加到 Dataframe

bzzcjhmw  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(106)

我是一个绝对的R新手。我想要实现的是根据同一行中的字符串值是否包含标识符,将标识符添加到每个 Dataframe 行。
假设 Dataframe :

df <- data.frame(Code = c("DE8230", "18FR16", "2UK34", "45BE87C", "1894DE56", "AB12FR", "ES12456"),
                 Type = c("A", "B", "C", "C", "E", "A", "C"),
                 Value = c(12, 14, 8, 20, 21, 16, 5))

      Code Type Value
1   DE8230    A    12
2   18FR16    B    14
3    2UK34    C     8
4  45BE87C    C    20
5 1894DE56    E    21
6   AB12FR    A    16
7  ES12456    C     5

我想根据"代码"列中是否存在标识符(例如DE、FR、UK、BE、ES)添加一个国家列,然后列出该国家。
我尝试了:

identifiers <- c("DE", "FR", "UK") #identifiers of choice

df <- mutate(df, country = 0)

for (i in 1:length(identifiers)){
  df <- mutate(df,
          country = ifelse(grepl(identifiers[i], Code), identifiers[i], country)
  )
}

其结果为:

Code Type Value country
1   DE8230    A    12      DE
2   18FR16    B    14      FR
3    2UK34    C     8      UK
4 1894DE56    C    20      DE
5   AB12FR    E    21      FR

虽然这是可行的,我认为一定有一个更优雅的解决方案,省略了for循环,只使用相同的dplyr语句。
注意:重要的是,所提到的标识符应列在单独的向量或列表中,而不是mutate语句的一部分。这只是一个假设的示例,数据集和标识符的数量要大得多。

dohp0rv5

dohp0rv51#

我们可以通过paste将标识符作为带有|分隔符的单个字符串使用str_extract,并从"代码"中提取这些子字符串

library(dplyr)
library(stringr)
df %>% 
  mutate(country = str_extract(Code, str_c(identifiers, collapse = "|"))) %>% 
   drop_na(country)
  • 输出
Code Type Value country
1   DE8230    A    12      DE
2   18FR16    B    14      FR
3    2UK34    C     8      UK
4 1894DE56    E    21      DE
5   AB12FR    A    16      FR

相关问题