为什么在 R 中并排两个单方括号

问题描述

我正在尝试用简单的代码学习数据清理。

我的中心问题是:两个单方括号并排有什么用?

这里以 df 为例。

df <- data.frame(x = c(1:3,NA,NA),y = c(6:9,NA))

以下代码是将 NA 替换为 99 的众多方法之一。而且我认为这很简单。

messy <- function(df,impute){
for (i in 1:nrow(df)) {
df[i,][is.na(df[i,])] <- impute
}
return(df)
}
clean <- messy(df,99)
clean
  1. 但是为什么我需要使用两个简单的方括号来定位 NA。
  2. 为什么不能将代码简化为 is.na(df[i,]) <- impute
  3. 是否有更有效的方法来替换 NA,例如使用 apply 系列?

非常感谢您的回答。

解决方法

这是一种非常复杂的替换 NA 的方法。您可以将功能减少到 -

messy <- function(df,impute){
  df[is.na(df)] <- impute
  df
}

clean <- messy(df,99)
clean

#   x  y
#1  1  6
#2  2  7
#3  3  8
#4 99  9
#5 99 99

您也可以使用 apply 系列函数,但此处不需要它们,因为 is.na 直接作用于数据帧。

,

这里有另外三种用 tidyverse 方法替换 NA 的方法:

library(tidyverse)

df <- data.frame(x = c(1:3,NA,NA),y = c(6:9,NA))

#purrr 
map_df(df,~replace_na(.x,99))
#> # A tibble: 5 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1     1     6
#> 2     2     7
#> 3     3     8
#> 4    99     9
#> 5    99    99

#transmute/across
df %>% transmute(across(everything(),99)))
#>    x  y
#> 1  1  6
#> 2  2  7
#> 3  3  8
#> 4 99  9
#> 5 99 99

#transmute_if
df %>% transmute_if(is.numeric,99))
#>    x  y
#> 1  1  6
#> 2  2  7
#> 3  3  8
#> 4 99  9
#> 5 99 99

reprex package (v2.0.0) 于 2021 年 6 月 14 日创建