Условно разбиваемые строки ячеек в кадре данных R - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть набор данных с названием вида, где некоторые первоначально использованные названия теперь устарели, поэтому они помечены как "старые_специалы *** вышедшие на пенсию *** используют новые_списки", тогда как правильные ячейки просто помечены как "новые_спеки". Вот пример данных:

df<- data.frame(species=c("Etheostoma spectabile","Ictalurus furcatus","Micropterus salmoides","Micropterus salmoides","Ictalurus punctatus","Ictalurus punctatus","Ictalurus punctatus","Micropterus salmoides","Etheostoma olmstedi","Noturus insignis","Lepomis auritus","Lepomis auritus","Nocomis leptocephalus","Scartomyzon rupiscartes***retired***use Moxostoma rupiscartes","Lepomis cyanellus","Notropis chlorocephalus","Scartomyzon cervinus***retired***use Moxostoma cervinum","Ictalurus punctatus","Lythrurus ardens","Moxostoma pappillosum","Micropterus salmoides","Micropterus salmoides","Ictalurus punctatus"))

Я пробовал

sapply(strsplit(df$species, split='***retired***use', fixed = T),function(x) (x[2])))

, но ячейки, для которых данные верны, возвращают NA, потому что они не содержат разбиение. Есть ли способ сделать разделение только для ячеек, содержащих его?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы можете изменить старые имена на новые, используя gsub плюс обратная ссылка:

gsub(".*\\*\\*\\*retired\\*\\*\\*use\\s(.*)", "\\1", df$species)

# [1] "Etheostoma spectabile"   "Ictalurus furcatus"      "Micropterus salmoides"   "Micropterus salmoides"  
# [5] "Ictalurus punctatus"     "Ictalurus punctatus"     "Ictalurus punctatus"     "Micropterus salmoides"  
# [9] "Etheostoma olmstedi"     "Noturus insignis"        "Lepomis auritus"         "Lepomis auritus"        
# [13] "Nocomis leptocephalus"   "Moxostoma rupiscartes"   "Lepomis cyanellus"       "Notropis chlorocephalus"
# [17] "Moxostoma cervinum"      "Ictalurus punctatus"     "Lythrurus ardens"        "Moxostoma pappillosum"  
# [21] "Micropterus salmoides"   "Micropterus salmoides"   "Ictalurus punctatus" 

Объяснение:

.* что угодно любое количество раз, за ​​которым следует ...

\\*\\*\\*retired\\*\\*\\*use\\s ... буквенный шаблон ***retired***use, за которым следует ...

(.*) ... что угодно сколько угодно раз - это группа захвата, которая обратная ссылка \\1 в аргументе замены gsub относится к

0 голосов
/ 29 апреля 2020

Мы можем создать индекс с grep, а затем разделить, используя эти строки

i1 <- grep('retired', df$species)
df$species <- as.character(df$species)
df$species[i1] <- sapply(strsplit(df$species[i1], "***retired***use ", 
                fixed = TRUE), `[`, 2)

df$species
#[1] "Etheostoma spectabile"   "Ictalurus furcatus"      "Micropterus salmoides"   "Micropterus salmoides"   "Ictalurus punctatus"    
#[6] "Ictalurus punctatus"     "Ictalurus punctatus"     "Micropterus salmoides"   "Etheostoma olmstedi"     "Noturus insignis"       
#[11] "Lepomis auritus"         "Lepomis auritus"         "Nocomis leptocephalus"   "Moxostoma rupiscartes"   "Lepomis cyanellus"      
#[16] "Notropis chlorocephalus" "Moxostoma cervinum"      "Ictalurus punctatus"     "Lythrurus ardens"        "Moxostoma pappillosum"  
#[21] "Micropterus salmoides"   "Micropterus salmoides"   "Ictalurus punctatus"    

Или используя регулярное выражение с sub

df$species <- sub(".*\\*{3}retired\\*{3}use\\s+", "", df$species)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...