R: новый столбец данных с использованием нескольких условий if - PullRequest
0 голосов
/ 31 января 2019

У меня есть фрейм данных, который содержит номера телефонов в разных форматах, я пытаюсь очистить неправильно отформатированные номера и унифицировать формат путем создания нового столбца.телефонные номера существуют в 3 столбцах: CountryCode, AreaCode, MobileNumber.Я написал следующий код для создания нового столбца на основе нескольких условий if:

library(dplyr)
data <- mutate(data, Number = 
                 if(nchar(data$MobileNumber >= 12))
                             {paste("+", data$MobileNumber)
                   } else if (nchar(data$MobileNumber >= 9))
                            {paste("+", data$CountryCode, data$MobileNumber)
                   } else if (data$CountryCode == data$AreaCode)
                            {paste("+", data$CountryCode, data$MobileNumber)
                   } else   (paste("+", data$CountryCode, data$AreaCode, data$MobileNumber)))

он действует на основе условия только первой строки, выдавая следующее предупреждение:

Warning message:
In if (nchar(data$MobileNumber >= 12)) { :
  the condition has length > 1 and only the first element will be used

Я также пытался создать 3 вектора для CountryCode, AreaCode, MobileNumber, а затем создать функцию, которая принимает 3 вектора в качестве входных данных и правильно отформатированное число в качестве выходных, используя условия if и цикл for, но также не удалась.

# x is number y is country code z is area code n is the output
x <- data$MobileNumber
y <- as.character(data$CountryCode)
z <- data$AreaCode

#cleaning function
out <- vector("character", nrow(data))
CleanNum <- function(x, y, z) 
  { for(i in 1:length(x))
       { if(nchar(x[i] >= 12))      {n[i] <- paste("+", x[i])
       } else if (nchar(x[i] >= 9)) {n[i] <- paste("+", y[i], x[i])
       } else if (y[i] == z[i])     {n[i] <- paste("+", y[i], x[i])
       } else                       (n[i] <- paste("+", y[i], z[i], x[i])) 
            out[i] <- n[i]    }}

Num_vec <- CleanNum(x, y, z)

У меня небольшой опыт в R, и любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вот еще одно решение, которое вы можете применить через mutate, как в первом примере.

data <- data %>%
    mutate(CountryCode = CountryCode %>%
               as.character(),
           Number = case_when(
               MobileNumber %>%
                   nchar() >= 12 ~ paste("+", 
                                         MobileNumber),
               MobileNumber %>% 
                   nchar() >= 9 ~ paste("+", 
                                        CountryCode,
                                        MobileNumber),
               CountryCode == AreaCode ~ paste("+",
                                               CountryCode,
                                               MobileNumber),
               TRUE ~ paste("+",
                            CountryCode,
                            AreaCode,
                            MobileNumber)
         )
)

Это решение позволяет вам продолжать работать с существующим data.frame, просто добавив еще один столбец.

0 голосов
/ 31 января 2019

Вот решение в base R с использованием vapply

data$Number <- vapply(1:nrow(data),function (k) {
  if(nchar(data$MobileNumber[k]) >= 12) return(paste("+", data$MobileNumber[k]))
  if(nchar(data$MobileNumber[k]) >= 9) return(paste("+", data$CountryCode[k], data$MobileNumber[k]))
  if (data$CountryCode[k] == data$AreaCode[k]) return(paste("+", data$CountryCode[k], data$MobileNumber[k]))
  paste("+", data$CountryCode[k], data$AreaCode[k], data$MobileNumber[k]))
}, character(1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...