我花了很多时间尝试编写一个循环来用数据帧中的某些列替换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?
这是一个整齐的方法:
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应该由定义的函数改变。其中.
对应于相应的列。
这是一个基础R单线
df[, varlist][is.na(df[, varlist])] <- 0
使用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