Code Type
123456 1
1234567 1
12345678 1
A123456 1
12345678 1
1
2345678 2

如果满足两个条件,我试图在代码列中的值前加0: i)代码值是一个数字(不包括字母或NA)。 ii)类型列等于1 这样,对于我正在构建的API请求,某些值是统一的8个字符。
我尝试过使用以下内容:
if(Type = 1 & !is.na(Code)) {
with_options(
c(scipen = 999),
str_pad(Code, 8, pad = "0")
)
}
对于上面的示例,我希望第一行更新为00123456,第二行更新为01234567.所有其他示例应保持不变。
我收到以下错误
Warning message:
In if (Type = 1 & !is.na(Code)) { :
the condition has length > 1 and only the first element will be used
我尝试过多种方式,但仍然会出错。
答案 0 :(得分:0)
这应该可以解决您的问题。我使用dplyr
来提高可读性,但也可以在没有它的情况下实现(使用基础ifelse
)
library(stringr)
library(dplyr)
data <-
structure(list(Code = c("123456", "1234567", "12345678", "A123456", "12345678", "", "2345678"),
Type = c(1L, 1L, 1L, 1L, 1L, 1L, 2L)), .Names = c("Code", "Type"),
class = "data.frame", row.names = c(NA, -7L))
data %>%
mutate(Code_new = if_else(!str_detect(Code, "[^\\d]") & Type == 1,
str_pad(data$Code, width = 8, side = "left", pad = "0"),
Code))
# Code Type Code_new
# 1 123456 1 00123456
# 2 1234567 1 01234567
# 3 12345678 1 12345678
# 4 A123456 1 A123456
# 5 12345678 1 12345678
# 6 1 00000000
# 7 2345678 2 2345678
说明:
首先,我使用!str_detect(Code, "[^\\d]") & Type == 1
检查修改代码列的条件。
如果要确保Code变量中至少有一个数字,请添加
& str_detect(Code, "\\d")
条件。
如果满足条件,则用0填充代码,否则返回原始代码条目。
使用if_else
代替ifelse
可确保TRUE
和FALSE
语句返回相同的矢量类型。