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值,您可以显式地检查NAif_else(is.na(value)| value==5,na,my_func(value))
。有哪些其他值失败的例子?@rpolicastro尝试运行您建议的。它仍然计算所有值的my_func
,因此失败。