是否有一种快速方法可以跨数据框变量运行多个算术运算,同时忽略具有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
答案 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