R中如何做多个操作,忽略了NA

时间:2017-01-25 07:41:29

标签: r dataframe arithmetic-expressions

是否有一种快速方法可以跨数据框变量运行多个算术运算,同时忽略具有NA的情况?我在下面举了一个简单的例子。

似乎我可以添加中间变量或者如果'陈述,但似乎过于复杂。

d1<-c(2,2,2,2)
d2<-c(1,1,1,1)
d3<-c(1,1,NA,NA)

df<-data.frame(d1,d2,d3)
df
  d1 d2 d3
1  2  1  1
2  2  1  1
3  2  1 NA
4  2  1 NA

df$d4<-d1*((d2) + (d3))
df
  d1 d2 d3 d4
1  2  1  1  4
2  2  1  1  4
3  2  1 NA NA
4  2  1 NA NA

我想得到的是:

df2<-data.frame(d1,d2,d3,d4=c(4,4,2,2))
    df2
      d1 d2 d3 d4
    1  2  1  1  4
    2  2  1  1  4
    3  2  1 NA  2
    4  2  1 NA  2

我可以用0替换所有值,但这也可能会产生误导。

编辑:

我已经尝试将NAs转换为0但是它不起作用,我不明白为什么。

df<-data.frame(d1,d2,d3)
df
df[is.na(df)] <- 0
df
  d1 d2 d3
1  2  1  1
2  2  1  1
3  2  1  0
4  2  1  0
df$d4<-d1*((d2) + (d3))
df
  d1 d2 d3 d4
1  2  1  1  4
2  2  1  1  4
3  2  1  0 NA
4  2  1  0 NA

1 个答案:

答案 0 :(得分:2)

如果您想将所有NAs更改为0,您可以执行以下操作:

df<-data.frame(d1=c(2,2,2,2), d2=c(1,1,1,1), d3=c(1,1,NA,NA))
df.new <- as.data.frame(lapply(df, function(x) ifelse(is.na(x), 0, x)))

或(感谢Sotos!):

df[is.na(df)] <- 0  

但要小心:这适用于所有列都是数字的数据帧。在其他情况下,您可能会遇到问题。以下是针对非数字列的解决方案:

df <- data.frame(d1=c(2,2,2,2), dx=c("A", "bb", "C", "DD"), d2=c(1,1,1,1), d3=c(1,1,NA,NA))
numCols <- sapply(df, is.numeric)

df[, numCols][is.na(df[, numCols])] <- 0
df