我花了很多时间尝试编写一个循环,用数据框中的某些列替换NAs并且还没有成功。我搜索过,找不到类似的问题。
df <- data.frame(A = c(2, 4, 6, NA, 8, 10),
B = c(NA, 10, 12, 14, NA, 16),
C = c(20, NA, 22, 24, 26, NA),
D = c(30, NA, NA, 32, 34, 36))
df
给我:
A B C D
1 2 NA 20 30
2 4 10 NA NA
3 6 12 22 NA
4 NA 14 24 32
5 8 NA 26 34
6 10 16 NA 36
我想仅为B列和D列设置NAs为0.使用单独的代码行,我可以:
df$B[is.na(df$B)] <- 0
df$D[is.na(df$D)] <- 0
但是,我想使用循环,因为我的实际数据集中有很多变量。
我找不到只循环B列和D列的方法,所以我得到:
df
A B C D
1 2 0 20 30
2 4 10 NA 0
3 6 12 22 0
4 NA 14 24 32
5 8 0 26 34
6 10 16 NA 36
基本上,我想使用变量列表将循环应用于数据框:
varlist <- c("B", "D")
如何使用变量列表仅覆盖数据框中的某些列以用零替换NA?
答案 0 :(得分:3)
这是一个整齐的方法:
library(tidyverse)
df %>%
mutate_at(.vars = vars(B, D), .funs = funs(ifelse(is.na(.), 0, .)))
#output:
A B C D
1 2 0 20 30
2 4 10 NA 0
3 6 12 22 0
4 NA 14 24 32
5 8 0 26 34
6 10 16 NA 36
基本上你说变量B和D应该由定义的函数改变。 .
对应于相应列的位置。
答案 1 :(得分:2)
这里是基础R单行
df[, varlist][is.na(df[, varlist])] <- 0
答案 2 :(得分:1)
使用zoo
包,我们可以填充选定的列。
library(zoo)
df[varlist]=na.fill(df[varlist],0)
df
A B C D
1 2 0 20 30
2 4 10 NA 0
3 6 12 22 0
4 NA 14 24 32
5 8 0 26 34
6 10 16 NA 36
在基地R我们可以有
df[varlist]=lapply(df[varlist],function(x){x[is.na(x)]=0;x})
df
A B C D
1 2 0 20 30
2 4 10 NA 0
3 6 12 22 0
4 NA 14 24 32
5 8 0 26 34
6 10 16 NA 36