如何在 R 中执行多项操作,忽略 NA
How to do multiple operations, ignoring NAs, in R
有没有一种快速的方法可以 运行 跨数据框变量进行多项算术运算,同时忽略 NA 的情况?我在下面放了一个简单的例子。
看来我可以添加中间变量或 'if' 语句,但这似乎太复杂了。
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 替换所有值,但这也可能会产生误导。
编辑:
我试过将 NA 转换为 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
如果你想把所有的 NA 都改成 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
有没有一种快速的方法可以 运行 跨数据框变量进行多项算术运算,同时忽略 NA 的情况?我在下面放了一个简单的例子。
看来我可以添加中间变量或 'if' 语句,但这似乎太复杂了。
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 替换所有值,但这也可能会产生误导。
编辑:
我试过将 NA 转换为 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
如果你想把所有的 NA 都改成 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