Tidyverse:If_else + str_length + str_pad 改变 1 列

Tidyverse: If_else + str_length + str_pad to mutate 1 column

我在我尝试 create/use 的代码片段的每个部分都发现了相当多的线程。但不是我正在尝试的方式。

我有一个客户信息的数据框。

1 列是客户 ID (CID),第 2 列是客户特定标识符 (CSI)

这意味着客户一个客户 ID 可以代表更大客户群中的许多特定客户,CSI 会告诉我我正在查看该客户群中的哪个特定客户。

数据如下所示:

data.frame("CID"=c("1","2","3","4","1","2","3","4"),
           "Customer_Pool"=c("Art_Supplies", "Automotive_Supplies", "Office_Supplies", "School_Supplies",
                             "Art_Supplies", "Automotive_Supplies", "Office_Supplies", "School_Supplies"),
           "CSI"=c("01","01","01","01","02","02","02","02"),
           "Customer_name"=c("Janet","Jane", "Jill", "Jenna", "Joe", "Jim", "Jack", "Jimmy"))

我正在尝试合并 CID 和 CSI 号码。问题是我需要所有 CID 都是两位数(例如 01 而不是 1)以匹配 10-99 的 CID

这是我一直在尝试的:

DF <- DF %>% mutate(CID = if_else(str_length(CID = 1),
                                 str_pad(CID, width = 2, side = "left), CID))

我收到的错误是:str_length(CID = 1) 中的错误:未使用的参数 (CID = 1)

我该如何纠正?

这里有一些语法问题。尝试

DF <- DF %>% mutate(CID = if_else(str_length(CID) == 1,
                                  str_pad(CID, width = 2, side = "left", pad="0"), CID))

当您调用 str_length(CID = 1) 时,您似乎正在将一个名为“CID”的参数传递给 str_length,它对此一无所知。相反,您想获取 CID 的字符串长度,然后将其与 == 的 1 进行比较以测试是否相等(而不是 = 用于参数名称和分配)。

但实际上 if_else 在这里不是必需的。如果一切都必须是 2 位数,那么就做

DF <- DF %>% mutate(CID = str_pad(CID, width = 2, side = "left", pad="0"))

str_pad 只在需要时填充。

基础 R 解决方案:

df$p_key <- with(df, paste(ifelse(nchar(CID) == 1, paste0("0", CID), CID), CSI, sep = "-"))

Tidyverse 使用 Mr Flick 的干净解决方案:

library(tidyverse)
df %>%
  mutate(p_key = str_c(str_pad(CID, width = 2, side = "left", , pad = "0"), CSI, sep = "-"))