【问题标题】:How to replace if the NA values in any column that should replace values by the next column's values in R programming如果任何列中的NA值应该用R编程中的下一列的值替换值,如何替换
【发布时间】:2021-02-08 08:52:22
【问题描述】:
  1. 如果任何列中的 NA 值应该用 R 编程中的下一列的值替换值,如何替换,这必须在没有特别提及列名称的情况下完成(没有硬编码)
  2. 在 R 编程中,应删除具有 NA 值的整个列
library(tidyverse)

df1 <- structure(list(GID = c("1", "2", "3", "4", "5", "NG1", "MG2", "MG3", "NG4"), 
                      ColA = c(NA, NA, NA, NA, NA, NA, NA, NA, NA), 
                      ColB = c("2", "4", "4", "5", "5", "", "1", "1", "")), 
                 row.names = c(NA, -9L), 
                 class = "data.frame")

df1 %>% 
  mutate(across(everything(), ~str_replace(., "^$", "N")),
         GID = GID %>% str_remove("N"))
#>   GID ColA   ColB
#> 1   1    NA    2
#> 2   2    NA    4
#> 3   3    NA    4
#> 4   4    NA    5
#> 5   5    NA    5
#> 6  G1    NA    N
#> 7 MG2    NA    1
#> 8 MG3    NA    1
#> 9  G4    NA    N

预期输出:

#>   GID ColA   
#> 1   1    2
#> 2   2    4    
#> 3   3    4    
#> 4   4    5    
#> 5   5    5    
#> 6  G1    N   
#> 7 MG2    1    
#> 8 MG3    1    
#> 9  G4    N    

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    我猜你已经对问题的第一部分有了答案,这是使用replace 的另一种方法。要删除包含所有 NA 的列,您可以使用 selectwhere

    library(dplyr)
    
    df1 %>%
      mutate(across(.fns = ~replace(., . == '', 'N')), 
             GID = sub('N', '', GID)) %>%
      select(-where(~all(is.na(.)))) %>%
      rename_with(~names(df1)[seq_along(.)])
    
    #  GID ColA
    #1   1    2
    #2   2    4
    #3   3    4
    #4   4    5
    #5   5    5
    #6  G1    N
    #7 MG2    1
    #8 MG3    1
    #9  G4    N
    

    【讨论】:

    • 它工作得很好,需要做一点小改动。如何仅更改值而不是列名。我的意思是在替换值之后,列“ColA”的名称也应该在那里(没有硬编码任何列名)
    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2020-05-18
    • 2017-12-19
    相关资源
    最近更新 更多