将一个数据框与另一个im左边的随机NA合并后偶然行。我想将这些NA设置为0,这样我就可以用它们进行计算。
我试着这样做:
bothbeams.data = within(bothbeams.data, {
bothbeams.data$x.x = ifelse(is.na(bothbeams.data$x.x) == TRUE, 0, bothbeams.data$x.x)
bothbeams.data$x.y = ifelse(is.na(bothbeams.data$x.y) == TRUE, 0, bothbeams.data$x.y)
})
其中$ x.x是一列而$ x.y当然是另一列,但这似乎不起作用。
答案 0 :(得分:49)
您可以使用is.na
的输出直接替换子集:
bothbeams.data[is.na(bothbeams.data)] <- 0
或者有一个可重复的例子:
dfr <- data.frame(x=c(1:3,NA),y=c(NA,4:6))
dfr[is.na(dfr)] <- 0
dfr
x y
1 1 0
2 2 4
3 3 5
4 0 6
答案 1 :(得分:8)
使用mutate_all
中dplyr
的解决方案,以防您想将其添加到dplyr
管道:
library(dplyr)
df %>%
mutate_all(funs(ifelse(is.na(.), 0, .)))
<强>结果:强>
A B C
1 1 1 2
2 2 2 5
3 3 1 2
4 0 2 0
5 1 1 0
6 2 2 0
7 3 1 3
8 0 2 0
9 1 1 3
10 2 2 3
11 3 1 0
12 0 2 3
13 1 1 4
14 2 2 4
15 3 1 0
16 0 2 0
17 1 1 1
18 2 2 0
19 3 1 2
20 0 2 0
如果在任何情况下你只想在数字列中替换NA,我认为在建模中可能就是这种情况,你可以使用mutate_if
:
library(dplyr)
df %>%
mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))
或在基础R:
replace(is.na(df), 0)
<强>结果:强>
A B C
1 1 0 2
2 2 NA 5
3 3 0 2
4 0 NA 0
5 1 0 0
6 2 NA 0
7 3 0 3
8 0 NA 0
9 1 0 3
10 2 NA 3
11 3 0 0
12 0 NA 3
13 1 0 4
14 2 NA 4
15 3 0 0
16 0 NA 0
17 1 0 1
18 2 NA 0
19 3 0 2
20 0 NA 0
数据:强>
set.seed(123)
df <- data.frame(A=rep(c(0:3, NA), 5), B=rep(c("0", "NA"), 10), C=c(sample(c(0:5, NA), 20, replace = TRUE)))
答案 2 :(得分:1)
要添加到James的示例中,您似乎总是必须在对包含NA的数据帧执行计算时创建中间值。
例如,从数据框dfr
中添加两列(A和B):
temp.df <- data.frame(dfr) # copy the original
temp.df[is.na(temp.df)] <- 0
dfr$C <- temp.df$A + temp.df$B # or any other calculation
remove('temp.df')
当我这样做时,我随后用remove
/ rm
丢弃中间体。
答案 3 :(得分:0)
您可以使用 replace_na()
包中的 tidyr
df %>% replace_na(list(column1 = 0, column2 = 0)
答案 4 :(得分:-2)
为什么不试试这个
na.zero <- function (x) {
x[is.na(x)] <- 0
return(x)
}
na.zero(df)