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