假设我有一个data.frame:
a <- c(1,2,3,4,5)
b <- c(0,1,NA,3,4)
c <- c(9,10,11,NA,13)
df <- data.frame(a,b,c)
我设法编写了一个自定义函数,我可以使用它来对行中的某些变量求和,同时忽略NAs(在这种情况下,我总结所有变量,但想象一个大数据。框架,我只需要添加一个几个变量):
sum.df.na.rm <- function(x) {
rowSums(df[,x], na.rm = TRUE)
}
df$d <- sum.df.na.rm(c("a","b","c"))
> df
a b c d
1 0 9 10
2 1 10 13
3 NA 11 14
4 3 NA 7
5 4 13 22
现在假设我想从a中减去b,并添加c,同时仍然忽略NA。我能做到:
df$bneg <- df$b * (-1)
df$e <- sum.df.na.rm(c("a","bneg","c"))
> df
a b c d bneg e
1 0 9 10 0 10
2 1 10 13 -1 11
3 NA 11 14 NA 14
4 3 NA 7 -3 1
5 4 13 22 -4 14
但是必须将b乘以(-1)才能在sum.df.na.rm
函数中减去它对我来说效率非常低。
如果不使用中间变量 bneg ,你会怎么做?
答案 0 :(得分:3)
定义您自己的运算符:
> `%+%` <- function(e1, e2) {e1[is.na(e1)] <- 0; e2[is.na(e2)] <- 0; return(e1 + e2)}
> `%-%` <- function(e1, e2) {e1[is.na(e1)] <- 0; e2[is.na(e2)] <- 0; return(e1 - e2)}
> within(df, e <- a %-% b %+% c)
a b c e
1 1 0 9 10
2 2 1 10 11
3 3 NA 11 14
4 4 3 NA 1
5 5 4 13 14