NB:下面的示例使用谓词is.na
,但这仅仅是一个示例。我对一般情况感兴趣。 (IOW,谓词可能是is.infinite
,或is.nan
,或其他任何东西。)如何替换满足谓词“即时”的位置?
假设一些表达foo(...)
评估为可能包含在它的一些NA
值的数据帧,并且该功能bar
需要NA
- 免费数据框作为参数。避免将无效参数bar
一种方法需要一个中间分配:
tmp <- foo(...)
tmp[is.na(tmp)] <- 0
bar(tmp)
有一些功能baz
,将允许与
bar(baz(foo(...), is.na, 0, ...))
做同样的事情... 从而避免需要中间分配?
我知道,我总是可以写我自己的baz
,但不知道是否像这样的东西已经可以在R.
UPDATE:
(针对弗兰克的评论。 )
例
x <- data.frame(K=1001:1005,
I=3:7,
R=c(0.1, 0.2, 0.3, 0.4, 0.5),
B=c(TRUE, FALSE, TRUE, FALSE, TRUE),
C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, 0.7+0.8i, 0.9+1.0i))
y <- data.frame(K=1001:1003,
S1=c("a", "b", "c"),
S2=c("d", "e", "f"),
stringsAsFactors = FALSE)
有了这些定义,那么foo(...)
可能是表达
merge(x, y, all = TRUE, by = "K")
为bar
,我想最简单的事情将一些人工,像
bar <- function (nonas) { stopifnot(!any(is.na(nonas))); nonas }
一个家庭轧baz
可能是
baz <- function (thing, predicate, value) {
thing[predicate(thing)] <- value
thing
}
然后,
bar(merge(x, y, all = TRUE, by = "K"))
## Error: !any(is.na(nonas)) is not TRUE
bar(baz(merge(x, y, all = TRUE, by = "K"), is.na, -1))
## K I R B C S1 S2
## 1 1001 3 0.1 TRUE 0.1+0.2i a d
## 2 1002 4 0.2 FALSE 0.3+0.4i b e
## 3 1003 5 0.3 TRUE 0.5+0.6i c f
## 4 1004 6 0.4 FALSE 0.7+0.8i -1 -1
## 5 1005 7 0.5 TRUE 0.9+1.0i -1 -1
您可以创建一个示例'tmp'来考虑至少吗?似乎很有可能'替换'功能可能会这样做... – Frank
@Frank:我在我的文章中添加了一个示例。另外,我不知道'replace'如何避免赋值给一个中间变量(如我的帖子中的'tmp')。 – kjo
对不起,我没有关注。你的文章似乎已经在'bar(baz(foo(),is.na,0))''where'foo = function()你的代码中包含了一个正常的函数。你问是否这样的函数已经存在于某些包中?顺便说一句,如果你不喜欢中间变量和括号,有'foo()%>%替换(pred(。),0)%>%bar' – Frank