R case_when-数据帧中字符数据的奇数行为

R case_when-数据帧中字符数据的奇数行为,r,dplyr,R,Dplyr,我有一个程序来解析和处理有关财务科目表的文本数据。当语句从不同的数据帧中提取值时,我试图实现一种基于case_的命名约定。当我这样做的时候,我得到一个字符(0)的结果,但我不知道为什么 我找不到有关此特定问题的任何文档,也找不到case_的一般字符长度限制。我创建了一个for循环来测试case_when语句中从1到100的字符长度,但没有遇到类似的问题,所以看起来不是这样。我已经确认我所有的课程都匹配了 # Example data frames data.functions <- dat

我有一个程序来解析和处理有关财务科目表的文本数据。当语句从不同的数据帧中提取值时,我试图实现一种基于case_的命名约定。当我这样做的时候,我得到一个字符(0)的结果,但我不知道为什么

我找不到有关此特定问题的任何文档,也找不到case_的一般字符长度限制。我创建了一个for循环来测试case_when语句中从1到100的字符长度,但没有遇到类似的问题,所以看起来不是这样。我已经确认我所有的课程都匹配了

# Example data frames
data.functions <- data.frame(
  Name = c("Insurance Services", "Cash"), Value = c("256800", "711000"),
  stringsAsFactors = F
)
data.objects <- data.frame(
  Name = "Payment to County", Value = "385", stringsAsFactors = F)
data.sources <- data.frame(
  Name = "Supply Resales", Value = "262", stringsAsFactors = F)

# Create value for i
i <- "E256800385"
# i <- "R000000262"
# i <- "B711000000"

# Split up the unique name ID
id_type <- substr(i, 1, 1)
id_func <- substr(i, 2, 7)
id_objsrc <- substr(i, 8, 10)

# Create name possibilities
# I split this out when the issue first occurred, originally this was
# directly in a mutate() statement
# Balance sheet account: Use function only
id_bal <- data.functions$Name[data.functions$Value == id_func]
# Expenditure account: Combine object and function
id_exp <- paste(
  data.objects$Name[data.objects$Value == id_objsrc],
  data.functions$Name[data.functions$Value == id_func],
  sep = " - "
  )
# Revenue account: Use source only
id_rev <- data.sources$Name[data.sources$Value == id_objsrc]

# # Alternative case
# id_bal <- "Bal"
# id_exp <- "Exp"
# id_rev <- "Rev"

# Select name based on ID type
id_name <- case_when(
  id_type == "B" ~ id_bal,
  id_type == "E" ~ id_exp,
  id_type == "R" ~ id_rev
)
我得到的是:

> id_name
character(0)
对于i的其他两个值也是一样的:

i <- "R000000262"
...
> id_name
character(0)

i <- "B711000000"
...
> id_name
character(0)
i id\u名称
字符(0)
我知道你的名字
字符(0)
但是,如果我对名称的可能性使用另一种情况,则代码的功能与预期相同:

id_bal <- "Bal"
id_exp <- "Exp"
id_rev <- "Rev"
...
> id_name
[1] "Bal"

id\u balSo
case\u when
要求所有公式的LHS和RHS长度均为1或n(它们必须相等)。就您现在的示例而言,
id\u rev
会导致此意外行为,因为它的长度为0,而其他RHS的长度为1

id_rev
character(0)

length(id_rev)
[1] 0
对于
id\u rev
,这可能只是示例代码中的一个错误,但是如果您期望这样的空值,我们可以使用替代变量定义

为了证明
id\u rev
是麻烦制造者,您可以将其调整为甚至一个空字符串,并且它将具有可接受的长度,即1

id_rev <- ""
length(id_rev)
[1] 1

谢谢你,这就解决了!
id_rev <- ""
length(id_rev)
[1] 1
dplyr::case_when(
  (id_type == "B") ~ id_bal,
  (id_type == "R") ~ id_rev,
  (id_type == "E") ~ id_exp
)
[1] "Payment to County - Insurance Services"