R 将用户定义的函数应用于TIBLE

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

我创建了一个用户定义的函数,它将在文本中搜索某些值,然后返回不同的值。但是,当我尝试在Tidyverse中使用它时,使用mutate时,它就不再起作用了。我得到一个警告:

警告信息:

在if(grepl(“Unique”,textValue)){:条件的长度大于1 并且只使用第一个元素

我猜它与类型和格式有关,但不确定如何解决它

# 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"))