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