Как использовать первый символ значения для выбранных значений в столбце фрейма данных в R? - PullRequest
0 голосов
/ 19 мая 2018

У меня есть столбец фрейма данных со значениями, такими как «DSL», «Волоконно-оптический», «Нет», NA, «Волоконно-оптический».как «Волоконная оптика», и я хочу оставить остальные значения, как это есть, то есть «DSL», «Нет» и NA должны оставаться неизменными.Я использовал приведенный ниже код. Однако я получаю сообщение об ошибке в условии if, которое использовал

Что не так с приведенным ниже кодом.

fix_cases_condition <- function(x){
  if (x!='DSL' | x!='No' | !is.na(x) ){
    first = toupper(substr(x,start = 1,stop = 1))
    rest = tolower(substr(x,start = 2,stop = nchar(x)))
    paste0(first,rest)
  }
}
internet$`Internet Service` <- sapply(internet$`Internet Service`,fix_cases_condition)

Ошибка:

Error in if (x != "DSL" | x != "No" | !is.na(x)) { : 
  missing value where TRUE/FALSE needed

Ответы [ 5 ]

0 голосов
/ 22 мая 2018

Вы можете просто использовать substr<- с substr:

test <-  c("DSL" , "Fiber optic" , "No", NA, "fiber optic")
substr(test,1,1) <- toupper(substr(test,1,1))
# [1] "DSL"         "Fiber optic" "No"          NA            "Fiber optic"
0 голосов
/ 20 мая 2018

Кроме того, мой приведенный выше код работал после внесения изменений в условие if,

fix_cases_condition <- function(x){
if (!is.na(x)){ 
if (x=='DSL' | x=='No'){x}else{
first = toupper(substr(x,start = 1,stop = 1))
rest = tolower(substr(x,start = 2,stop = nchar(x)))
paste0(first,rest)
}
}
}
internet$`Internet Service` <- sapply(internet$`Internet Service`,fix_cases_condition)
0 голосов
/ 19 мая 2018

Мы проверяем наличие нескольких слов в строке, создаем логический индекс и изменяем только первый символ этих элементов на верхний регистр с sub в base R

i1 <- grepl("\\s+", str1)
str1[i1] <- sub("^(.)", "\\U\\1", str1[i1], perl = TRUE)
str1
#[1] "DSL"         "Fiber optic" "No"          NA            "Fiber optic"

или на основев этом примере мы можем непосредственно применить sub к вектору, чтобы захватить один символ ((.)) с начала (^), и заменить его преобразованием в верхний регистр (\\U), за которым следует обратная ссылка (* 1011)*) захваченной группы

sub("^(.)", "\\U\\1", str1, perl = TRUE)
#[1] "DSL"         "Fiber optic" "No"          NA            "Fiber optic"

данные

str1 <- c("DSL" , "Fiber optic" , "No", NA, "fiber optic")
0 голосов
/ 19 мая 2018

Нет необходимости проверять какие-либо конкретные слова.Просто нужно проверять и избегать NA.ОП может переписать свою функцию, используя substring и toupper как:

FirstCap <- function(x) {
  for(i in seq_along(x)){
    if(!is.na(x[i])){
       x[i] = paste0(toupper(substring(x[i], 1, 1)), substring(x[i], 2), sep = "")
    }
  }
  x
}

vector <- c( "DSL" , "Fiber optic" , "No", NA, "fiber optic")

FirstCap(vector)
#[1] "DSL"         "Fiber optic" "No"          NA            "Fiber optic"

#Some more usages of the function FirstCap
FirstCap(c("hello world", "i m hero", "its interesting to work in r"))
#[1] "Hello world"     "I m hero"            "Its interesting to work in r"
0 голосов
/ 19 мая 2018

Используйте прописные (), убедитесь, что вы включили библиотеку (Hmisc)

Итак,

library(Hmisc)
abc <- c("DSL" , "Fiber optic" , "No", NA, "fiber optic")
capitalize(abc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...