用于整理数据的多个条件值替换

时间:2017-12-04 11:01:45

标签: r



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

我尝试过多种方式,但仍然会出错。

1 个答案:

答案 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可确保TRUEFALSE语句返回相同的矢量类型。