Условный префикс строки в R - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть такой фрейм данных

X <- data.frame(value = c(1,2,3,4,5,6), 
            variable = c("AA", "ab", "BB", "ad", "da", "DD"))

Я пытаюсь условно добавить префикс символа ко всем переменным так, чтобы результирующий фрейм данных был примерно таким (префикс G, когда у нас есть заглавные буквы иM с префиксом, когда у нас есть маленькие буквы)

1   GAA
2   Mab
3   GBB
4   Mad
5   Mda
6   GDD

Я пытался написать функцию для достижения, которая выглядит следующим образом

prefix <- function(raw_data)
{
  if(raw_data$Members %like% "^[a-z]") {
    raw_data$Members = paste0('M', raw_data$Members)
  }
  else {if(raw_data$Members %like% "^[A-Z]")
  {
    raw_data$Members = paste0('G', raw_data$Members)
  }
  }
}

Это либо префикс только G или только M. Пожалуйста, помогитемне определить, что не так с этой функцией или есть ли лучший способ сделать это.

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Проверьте, равна ли версия переменной tolower оригиналу, и используйте результат для индексации вектора с помощью "G" и "M":

paste0(c("G", "M")[(X$variable == tolower(X$variable)) + 1], X$variable)
# [1] "GAA" "Mab" "GBB" "Mad" "Mda" "GDD"
0 голосов
/ 11 декабря 2018

Другой вариант - использовать sub.Возможно, не лучшее решение в этом случае, но это более общее решение для «Условного префикса строки в R».

X$variable <- sub('(?=^[A-Z])', 'G', X$variable, perl = T)

X$variable <- sub('(?=^[a-z])', 'M', X$variable, perl = T)

X

#   value variable
# 1     1      GAA
# 2     2      Mab
# 3     3      GBB
# 4     4      Mad
# 5     5      Mda
# 6     6      GDD

Тидиверс эквивалент:

library(tidyverse)

X %>% 
  mutate_at('variable', ~ str_replace(., '(?=^[A-Z])', 'G') %>% 
                            str_replace('(?=^[a-z])', 'M'))
0 голосов
/ 10 декабря 2018

Используйте ifelse и grepl, чтобы проверить, начинается ли элемент со строчной буквы или нет.

ifelse(grepl("^[a-z]", X$variable), paste0("M", X$variable), paste0("G", X$variable))
#[1] "GAA" "Mab" "GBB" "Mad" "Mda" "GDD"
...