为什么在 R 中并排放置两个方括号
Why two single square brackets side by side in 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
- 但为什么我需要使用两个简单的方括号来定位 NA。
- 为什么不能将代码简化为
is.na(df[i, ]) <- impute
?
- 有没有更有效的方法来替换 NA,比如使用 apply family?
非常感谢您的回答。
这是替换 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(), ~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
由 reprex package (v2.0.0)
于 2021 年 6 月 14 日创建
我正在尝试用简单的代码学习数据清理。
我的中心问题是:两个并排的方括号有什么用?
这里以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
- 但为什么我需要使用两个简单的方括号来定位 NA。
- 为什么不能将代码简化为
is.na(df[i, ]) <- impute
? - 有没有更有效的方法来替换 NA,比如使用 apply family?
非常感谢您的回答。
这是替换 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(), ~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
由 reprex package (v2.0.0)
于 2021 年 6 月 14 日创建