Я пытаюсь стандартизировать названия видов в фрейме данных. Я использовал str_replace_all()
для этого. Однако вместо замены старого имени функция добавляет символы к новому имени. Названия перепутаны, некоторые уже правильные, а некоторые мне нужно исправить, но мне нужно скорректировать более 30 названий видов. Какие-нибудь советы?
Пример кода:
library(tidyverse)
var1 <- c(1:5)
var2 <- c("Nemophila menziesii", "Nemophila menziesii var.menziesii", "Ceanothus cuneatus", "Ceanothus cuneatus var.cuneatus", "Diplacus auranticus")
df <- as.data.frame(var2, var1)
df %>%
mutate(var2 = str_replace_all(var2, "Nemophila menziesii", "Nemophila menziesii var.menziesii")) %>%
mutate(var2 = str_replace_all(var2, "Ceanothus cuneatus", "Ceanothus cuneatus var.cuneatus"))
Что выводит:
var2
1 Nemophila menziesii var.menziesii
2 Nemophila menziesii var.menziesii var.menziesii
3 Ceanothus cuneatus var.cuneatus
4 Ceanothus cuneatus var.cuneatus var.cuneatus
5 Diplacus auranticus
Строки 2 и 4 — прекрасный пример моей проблемы. Это должно быть просто «Ceanothus cuneatus var.cuneatus» или «Nemophila menziesii var.menziesii».
Это может сработать - если вы поместите $
в заменяемый шаблон, он заменит его только тогда, когда в переменной будет вся строка:
library(tidyverse)
var1 <- c(1:5)
var2 <- c("Nemophila menziesii", "Nemophila menziesii var.menziesii", "Ceanothus cuneatus", "Ceanothus cuneatus var.cuneatus", "Diplacus auranticus")
df <- as.data.frame(var2, var1)
df %>%
mutate(var2 = str_replace_all(var2, "Nemophila menziesii$", "Nemophila menziesii var.menziesii")) %>%
mutate(var2 = str_replace_all(var2, "Ceanothus cuneatus$", "Ceanothus cuneatus var.cuneatus"))
#> var2
#> 1 Nemophila menziesii var.menziesii
#> 2 Nemophila menziesii var.menziesii
#> 3 Ceanothus cuneatus var.cuneatus
#> 4 Ceanothus cuneatus var.cuneatus
#> 5 Diplacus auranticus
В исходных примерах str_replace_all
является идеально находит шаблон в строках в строках 2 и 4 и заменяет их строкой замены. Но это происходит в пределах строк и оставляет суффиксы на месте. Приведенный выше синтаксис говорит: «Найти шаблон, только если он не содержит ничего после него».
Возможно, вы думали о своего рода if_else
или case_when
замене установки? Как показано ниже, которое проверяет соответствие всей строки и дает тот же результат:
df %>%
mutate(var2 = case_when(
var2 == "Nemophila menziesii" ~ "Nemophila menziesii var.menziesii",
var2 == "Ceanothus cuneatus" ~ "Ceanothus cuneatus var.cuneatus",
TRUE ~ var2))
#> var2
#> 1 Nemophila menziesii var.menziesii
#> 2 Nemophila menziesii var.menziesii
#> 3 Ceanothus cuneatus var.cuneatus
#> 4 Ceanothus cuneatus var.cuneatus
#> 5 Diplacus auranticus
Created on 2022-03-18 by the reprex package (v2.0.1)
Без проблем! также добавлено краткое альтернативное решение :)