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