web-dev-qa-db-ja.com

R *を除くすべての列のNAを置き換える

_library(tidyverse)
df <- tibble(Date = c(rep(as.Date("2020-01-01"), 3), NA),
             col1 = 1:4,
             thisCol = c(NA, 8, NA, 3),
             thatCol = 25:28,
             col999 = rep(99, 4))
#> # A tibble: 4 x 5
#>   Date        col1  thisCol thatCol col999
#>   <date>     <int>    <dbl>   <int>  <dbl>
#> 1 2020-01-01     1       NA      25     99
#> 2 2020-01-01     2        8      26     99
#> 3 2020-01-01     3       NA      27     99
#> 4 NA             4        3      28     99
_

私の実際のRデータフレームには何百もの列があり、きちんと名前が付けられていませんが、上のdfデータフレームで概算できます。

いくつかの列を除いて、NAのすべての値を_0_に置き換えたい(この例では、Date列とthatCol列を省略したい。このような方法で実行したい:

_df %>% replace(is.na(.), 0)
#> Error: Assigned data `values` must be compatible with existing data.
#> i Error occurred for column `Date`.
#> x Can't convert <double> to <date>.
#> Run `rlang::last_error()` to see where the error occurred.
_

そして、NAを置き換える「以外のすべて」を達成するための私の失敗したアイデアを以下に示します。

_df %>% replace(is.na(c(., -c(Date, thatCol)), 0))
df %>% replace_na(list([, c(2:3, 5)] = 0))
df %>% replace_na(list(everything(-c(Date, thatCol)) = 0))
_

必要な方法ですべてを選択する方法はありますか?一貫性のない名前が付けられた数百の列があるため、1つずつ入力することは現実的な選択肢ではありません。

3
Jason Hunter

replaceはdata.frameで機能するため、インデックスによる置換を実行して元のデータセットを更新するだけです

df[-c(1, 4)] <- replace(df[-c(1, 4)], is.na(df[-c(1, 4)]), 0)

またはreplace_na with across(新しいdplyrから)

library(dplyr)
library(tidyr)
df %>% 
     mutate(across(-c(Date, thatCol), ~ replace_na(., 0)))
1
akrun

変更したくないものを知っている場合は、次のようにすることができます。

df <- tibble(Date = c(rep(as.Date("2020-01-01"), 3), NA),
             col1 = 1:4,
             thisCol = c(NA, 8, NA, 3),
             thatCol = 25:28,
             col999 = rep(99, 4))


#dplyr
df_nonreplace <- select(df, c("Date", "thatCol"))

df_replace <- df[ ,!names(df) %in% names(df_nonreplace)]

df_replace[is.na(df_replace)] <- 0

df <- cbind(df_nonreplace, df_replace)


> head(df)
        Date thatCol col1 thisCol col999
1 2020-01-01      25    1       0     99
2 2020-01-01      26    2       8     99
3 2020-01-01      27    3       0     99
4       <NA>      28    4       3     99
0
mmb_rach