如何解决在tidyverse的mutate函数中,R函数必须使用什么参数?
A的小标题带有一列,其中的字符串表示小时和分钟。 我想整理一下该列,然后将元素转换为仅代表分钟的整数。
这些字符串可以具有以下形式之一:
- “ 5”(表示5分钟)
- “ XX分钟”(意味着xx分钟)
- “ X标准”(意味着x个小时)
- “ X标准YY分钟”(意思是x小时和y分钟)
我编写了一个函数,将这些字符串转换为分钟。
- “ 5”应变为5。
- “ 45分钟”应变为45。
- “ 2标准”应变为120。
- “ 1个标准时间30分钟”应变为90。
该函数的外观如下:
convert_ZA_time <- function(string) {
if (nchar(string) == 1) {
result <- as.integer(string)
}
else if (endsWith(string," Std")) {
result <- as.integer(substring(string,1,1)) * 60
}
else if (endsWith(string," min") && nchar(string) == 6) {
result <- as.integer(substring(string,2))
}
else if (endsWith(string," min") && nchar(string) > 6) {
hour <- as.integer(gsub(" Std.*","",string,perl = TRUE))
minute_plus <- gsub("^\\d+ Std. ",perl = TRUE)
minute <- as.integer(gsub(" min$",minute_plus))
result <- hour * 60 + minute
}
else {result <- NA}
return(result)
}
使用字符串进行测试就可以了:
convert_ZA_time("2 Std. 50 min")
# prints [1] 170
但是当我尝试在tidyverse mutate函数中使用此函数时,出现以下错误:
df <- tibble(datestr = c("5","45 min","1 Std","2 Std. 30 min"))
df2 <- df %>% mutate(minutes = convert_ZA_time(datestr))
# throws error: the condition has length > 1 and only the first element will be used
如何更改功能才能正确使用mutate?
P.S。据我了解:mutate接受每个“ datestr”并将其放入函数“ convert_ZA_time”中。但是显然mutate将一个向量放到函数中了吗?
感谢您的帮助!
解决方法
您的功能还没有Vectorize
被删除。
convert_ZA_time(c("2 Std. 50 min","3 Std. 50 min"))
# [1] 170 230
# Warning messages:
# 1: In if (nchar(string) == 1) { :
# the condition has length > 1 and only the first element will be used
# 2: In if (endsWith(string," Std")) { :
# the condition has length > 1 and only the first element will be used
修复:
convert_ZA_timev <- Vectorize(convert_ZA_time)
convert_ZA_timev(c("2 Std. 50 min","3 Std. 50 min"))
# 2 Std. 50 min 3 Std. 50 min
# 170 230
说明
函数中有一个if
/ else
结构,如下所示:
fun <- function(x) if (x >= 0) "pos" else "neg"
应用于长度大于1的v
扇区时,它将仅评估带有警告的第一个元素。
v <- -2:2
fun(v)
# [1] "neg"
# Warning message:
# In if (x >= 0) "pos" else "neg" :
# the condition has length > 1 and only the first element will be used
fun(v[1])
# [1] "neg"
向量化使函数能够处理向量。
funv <- Vectorize(fun)
funv(v)
# [1] "neg" "neg" "pos" "pos" "pos"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。