R 将用户定义的函数应用于TIBLE
我创建了一个用户定义的函数,它将在文本中搜索某些值,然后返回不同的值。但是,当我尝试在Tidyverse中使用它时,使用mutate时,它就不再起作用了。我得到一个警告: 警告信息: 在if(grepl(“Unique”,textValue)){:条件的长度大于1 并且只使用第一个元素 我猜它与类型和格式有关,但不确定如何解决它R 将用户定义的函数应用于TIBLE,r,function,mutate,R,Function,Mutate,我创建了一个用户定义的函数,它将在文本中搜索某些值,然后返回不同的值。但是,当我尝试在Tidyverse中使用它时,使用mutate时,它就不再起作用了。我得到一个警告: 警告信息: 在if(grepl(“Unique”,textValue)){:条件的长度大于1 并且只使用第一个元素 我猜它与类型和格式有关,但不确定如何解决它 # create fake data P1 = c("Unique Claims", "Unique Records", "Spend Today", "Spend Y
# create fake data
P1 = c("Unique Claims", "Unique Records", "Spend Today", "Spend Yesterday", "% Returned", "% Claimed")
P2 = as.tibble(P1)
#create function
assignFormat <- function (textValue = as.character()) {
if (grepl("Unique", textValue) > 0) {
numFormat = "Comma"
} else if (grepl("Spend", textValue) > 0) {
numFormat = "Currency"
} else if (grepl("%", textValue, ) > 0 ) {numFormat = "Percent"}
else numFormat = "Other"
return(numFormat)
}
#test function - works fine
assignFormat("% of CLaims")
assignFormat("Unique Records")
assignFormat("Total Spend")
#doesn't work
P3 = P2 %>%
mutate(y = assignFormat(value))
#创建假数据
P1=c(“唯一索赔”、“唯一记录”、“今天花费”、“昨天花费”、“返回百分比”、“索赔百分比”)
P2=as.tible(P1)
#创建函数
分配格式(0){
numFormat=“逗号”
}如果(grepl(“花费”,textValue)>0,则为else){
numFormat=“货币”
}如果(grepl(“%”,textValue,)>0{numFormat=“Percent”}
else numFormat=“其他”
返回(numFormat)
}
#测试功能-工作正常
转让格式(“索赔的百分比”)
指定格式(“唯一记录”)
分配格式(“总支出”)
#不起作用
P3=P2%>%
变异(y=赋值格式(值))
我尝试过的事情:
切换到grep
直接在mutate中使用GREP-创建三个向量
感谢您的选择和帮助 使用sapply
:
要添加到数据帧,请执行以下操作:
P2%>%
变异(y=sapply(值,赋值格式))
#一个tibble:6x2
y值
1唯一索赔逗号
2个唯一记录逗号
3.今日消费货币
4.花昨天的钱
5%的退货率
6%的人声称
错误消息实际上是提供信息的。该函数设计用于单个元素,因此我们使用
apply
函数族将其“矢量化”。因为我们期望每个输入都有一个结果,所以我们使用sapply
来返回输出向量。如果使用按行分组,则许多字符串函数在dplyr
中都能正常工作
#does work
P3 = P2 %>%
rowwise() %>%
mutate(y = assignFormat(value)) %>%
ungroup()
要使用相同的功能,可以使用map
variants
library(dplyr)
library(purrr)
P2 %>% mutate(y = map_chr(value, assignFormat))
# A tibble: 6 x 2
# value y
# <chr> <chr>
#1 Unique Claims Comma
#2 Unique Records Comma
#3 Spend Today Currency
#4 Spend Yesterday Currency
#5 % Returned Percent
#6 % Claimed Percent
或者另一个选项是在
设计用于此类操作时使用case_
P2 %>%
mutate(y = case_when(grepl("Unique", value) ~ "Comma",
grepl("Spend", value) ~ "Currency",
grepl("%", value) ~ "Percent",
TRUE ~ "Other"))
@Rich Pauloo:感谢您的编辑,但是在没有进一步参数的管道中通常不需要括号。这是完全正确的,但通常用()
指示函数以及您在文档中看到的内容是很好的做法。谢谢,这正是我需要的!但这并不能很好地将其添加到数据帧中:(
library(dplyr)
library(purrr)
P2 %>% mutate(y = map_chr(value, assignFormat))
# A tibble: 6 x 2
# value y
# <chr> <chr>
#1 Unique Claims Comma
#2 Unique Records Comma
#3 Spend Today Currency
#4 Spend Yesterday Currency
#5 % Returned Percent
#6 % Claimed Percent
assignFormat <- function (textValue = as.character()) {
ifelse(grepl("Unique", textValue), "Comma",
ifelse(grepl("Spend", textValue), "Currency",
ifelse(grepl("%", textValue),"Percent", "Other")))
}
P2 %>% mutate(y = assignFormat(value))
P2 %>%
mutate(y = case_when(grepl("Unique", value) ~ "Comma",
grepl("Spend", value) ~ "Currency",
grepl("%", value) ~ "Percent",
TRUE ~ "Other"))