R 仅对mutate中的行子集求值函数

R 仅对mutate中的行子集求值函数,r,dplyr,subset,R,Dplyr,Subset,是否有一种方法可以使用对未包含行失败的函数对行子集进行变异 我正在尝试使用my_func,但对于某些值它失败(5,在下面的玩具示例中)。我是否可以在某些行上计算此函数,而在其他行上不计算,返回NA?我尝试使用if\u else,但它对函数的所有值进行求值,导致函数失败: my_func = function(x) { if (any(x == 5)) stop("Fail!") return(x + 1) } data.frame(value = c(1, 5, 2

是否有一种方法可以使用对未包含行失败的函数对行子集进行
变异

我正在尝试使用
my_func
,但对于某些值它失败(
5
,在下面的玩具示例中)。我是否可以在某些行上计算此函数,而在其他行上不计算,返回
NA
?我尝试使用
if\u else
,但它对函数的所有值进行求值,导致函数失败:

my_func = function(x) {
  if (any(x == 5)) stop("Fail!")
  return(x + 1)
}

data.frame(value = c(1, 5, 2)) %>%
  mutate(result = if_else(value == 5, NA, my_func(value)))
我可以围绕
my_func
构建一个包装器来删除中断值,并在返回之前将这些值插入
my_func
的返回中,但这似乎过于复杂


更新:解决方案不得更改我的功能!我最近遇到的问题是
my_func
quantreg::predict.rqss
my_func
中使用
ifelse
,这样它就可以处理向量值

my_func = function(x) {
  ifelse(is.na(x), NA, x + 5)
}
现在,您可以将其用作:

data.frame(value = c(NA, 1, 2)) %>%
  mutate(result = my_func(value))
此外,这将返回相同的输出,因此您不需要在此处检查
NA
s

data.frame(value = c(NA, 1, 2)) %>% mutate(result = value + 5)

如果我们不能明确地更改条件测试和NA测试的
my_func

my_func = function(x) {
  if (is.na(x) || x == 5) return(NA)
    else return(x + 1)
}
并按行应用函数:

data.frame(value = c(NA, 1, 2)) %>%
  rowwise() %>%
  mutate(result = my_func(value))
这是一个解决方案:

eval_subset=函数(x,fun,subset,false=NA){
x[subset]=fun(x[subset])#对subset==TRUE的值应用fun
x[!subset]=false#插入默认值
返回(x)
}
像这样使用它:

data.frame(值=c(1,5,2))%>%
变异(结果=eval_子集(值,my_func,值!=5))

这对我来说有点麻烦。我希望有更内置的功能,但它很有效。

我更新了问题,强调我不能更改
my_func
。不幸的是,您的解决方案不适用。我还将其更新为值
5
失败,以便在许多情况下不会受到R对
NA
固有处理的诱惑。您还在更新中更改了
my_func
。再说一遍,我不能那样做。但是我想你可以用包装器函数做同样的事情。我已经发布了一个答案,这个答案是矢量化的,因此它比按行使用要快/简单得多。我一直在寻找更适合
dplyr
或其他软件包的东西,因为这似乎是一个不太少见的用例。对于NA值,您可以显式地检查NA
if_else(is.na(value)| value==5,na,my_func(value))
。有哪些其他值失败的例子?@rpolicastro尝试运行您建议的。它仍然计算所有值的
my_func
,因此失败。