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 = "-"))
我在我尝试 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 = "-"))