gpt4 book ai didi

r - R 函数必须在 tidyverse 的 mutate 函数中使用什么参数?

转载 作者:行者123 更新时间:2023-12-04 00:53:56 25 4
gpt4 key购买 nike

A 有一个小标题,其中有一列字符串代表小时和分钟。我想整理该列并将元素转换为仅代表分钟的整数。

这些字符串可以具有以下形式之一:

  • “5”(表示 5 分钟)
  • “XX分钟”(意思是xx分钟)
  • “X Std”(意思是 x 小时)
  • “X Std. YY min”(意思是 x 小时和 yy 分钟)

我编写了一个函数将这些字符串转换为分钟。

  • “5”应该变成 5。
  • “45 分钟”应该变成 45。
  • “2 Std”应该变成 120。
  • “1 Std. 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, 1, 2))
}
else if (endsWith(string, " min") && nchar(string) > 6) {
hour <- as.integer(gsub(" Std.*", "", string, perl = TRUE))
minute_plus <- gsub("^\\d+ Std. ", "", string, 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 中正确使用它?

附言据我了解: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"

关于r - R 函数必须在 tidyverse 的 mutate 函数中使用什么参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64224902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com