R - 如何对行上的一些但不是所有变量执行算术运算,省略NA

时间:2014-02-20 10:32:58

标签: r dataframe

假设我有一个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 ,你会怎么做?

1 个答案:

答案 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