R:使用多个if条件的数据框新列

时间:2019-01-31 09:59:08

标签: r dataframe for-loop if-statement dplyr

我有一个数据框,其中包含不同格式的电话号码,我正在尝试清除格式错误的号码,并通过创建新列来统一格式。 电话号码分为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

我也曾尝试为CountryCode,AreaCode,MobileNumber创建3个向量,然后创建一个函数,使用if条件和for循环将这3个向量作为输入,并将正确格式化的数字作为输出,但也没有成功。

# 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 :(得分:0)

这是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))

答案 1 :(得分:0)

这是另一个解决方案,您可以像第一个示例一样通过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。