我想用20列中的0代替NA。我发现这种方法适用于2列,但是如果列数为20,我认为这不是最佳选择。是否有其他替代方法和更紧凑的解决方案?
mydata[,c("a", "c")] <-
apply(mydata[,c("a","c")], 2, function(x){replace(x, is.na(x), 0)})
Run Code Online (Sandbox Code Playgroud)
更新:为简单起见,让我们用8列获取此数据,并用b,c,e,f和d列替换NA
a b c d e f g d
1 NA NA 2 3 4 7 6
2 g 3 NA 4 5 4 Y
3 r 4 4 NA t 5 5
Run Code Online (Sandbox Code Playgroud)
结果必须是这样的:
a b c d e f g d
1 0 0 2 3 4 7 6
2 g 3 NA 4 5 4 Y
3 r 4 4 0 t 5 5
Run Code Online (Sandbox Code Playgroud)
下面是tidyverse根据列的数据类型将 NA 替换为不同值的方法。
library(tidyverse)
dataset %>% mutate_if(is.numeric, replace_na, 0) %>%
mutate_if(is.character, replace_na, "")
Run Code Online (Sandbox Code Playgroud)
小智 8
replace_nafrom 的功能tidyr可以应用于矢量以及数据框(http://tidyr.tidyverse.org/reference/replace_na.html)。
与使用它mutate_at的变化,从dplyr在同一时间将其应用到多个列:
my_data %>% mutate_at(vars(b,c,e,f), replace_na, 0)
Run Code Online (Sandbox Code Playgroud)
要么
my_data %>% mutate_at(c('b','c','e','f'), replace_na, 0)
Run Code Online (Sandbox Code Playgroud)
另一种策略使用tidyr::replace_na()
library(tidyverse)
df <- read.table(header = T, text = 'a b c d e f g h
1 NA NA 2 3 4 7 6
2 g 3 NA 4 5 4 Y
3 r 4 4 NA t 5 5')
df %>%
mutate(across(everything(), ~replace_na(., 0)))
#> a b c d e f g h
#> 1 1 0 0 2 3 4 7 6
#> 2 2 g 3 0 4 5 4 Y
#> 3 3 r 4 4 0 t 5 5
Run Code Online (Sandbox Code Playgroud)
由reprex 包于 2021 年 8 月 22 日创建(v2.0.0)
Another option:
library(tidyr)
v <- c('b', 'c', 'e', 'f')
replace_na(df, as.list(setNames(rep(0, length(v)), v)))
Run Code Online (Sandbox Code Playgroud)
Which gives:
# a b c d e f g d.1
#1 1 0 0 2 3 4 7 6
#2 2 g 3 NA 4 5 4 Y
#3 3 r 4 4 0 t 5 5
Run Code Online (Sandbox Code Playgroud)
我们可以使用NAerfromqdap将 NA 转换为 0。如果有多列,则使用 循环lapply。
library(qdap)
nm1 <- c('b', 'c', 'e', 'f')
mydata[nm1] <- lapply(mydata[nm1], NAer)
mydata
# a b c d e f g d.1
#1 1 0 0 2 3 4 7 6
#2 2 g 3 NA 4 5 4 Y
#3 3 r 4 4 0 t 5 5
Run Code Online (Sandbox Code Playgroud)
或者使用dplyr
library(dplyr)
mydata %>%
mutate_each_(funs(replace(., which(is.na(.)), 0)), nm1)
# a b c d e f g d.1
#1 1 0 0 2 3 4 7 6
#2 2 g 3 NA 4 5 4 Y
#3 3 r 4 4 0 t 5 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |