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

Why two single square brackets side by side in R

提问人:ronzenith 提问时间:6/14/2021 更新时间:6/14/2021 访问量:113

问:

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

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

下面是一个例子。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 系列?

非常感谢您的回答。

R na 数据清理 方括号

评论

0赞 Phil 6/14/2021
仅供参考,dplyr 包有一个包可以做到这一点。replace_na()

答:

2赞 Ronak Shah 6/14/2021 #1

这是一种非常复杂的替换 's 的方法。您可以将函数简化为 -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

您也可以使用函数系列,但这里不需要它们,因为它们直接在数据帧上工作。applyis.na

评论

0赞 ronzenith 6/14/2021
谢谢!您的建议简单快捷!如果我坚持使用,我该怎么办?apply
0赞 Ronak Shah 6/14/2021
您可以使用 .这也可以与按行或按列一起使用。df[] <- lapply(df, function(x) replace(x, is.na(x), impute))apply
0赞 ronzenith 6/14/2021
话虽如此,我可以知道为什么那行代码中有两个方括号吗? 谢谢。df[i, ][is.na(df[i, ])]
0赞 Ronak Shah 6/14/2021
第一个 () 子集一行,第二个子集该行的值 ()。df[i, ]NAis.na(df[i, ])]
0赞 jpdugo17 6/14/2021 #2

以下是用整洁方法替换 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(), ~replace_na(.x, 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, ~replace_na(.x, 99))
#>    x  y
#> 1  1  6
#> 2  2  7
#> 3  3  8
#> 4 99  9
#> 5 99 99

创建于 2021-06-14 由 reprex 软件包 (v2.0.0)