【问题标题】:R: Substitute multiple unwanted variables with NAs across multiple columnsR:在多个列中用 NA 替换多个不需要的变量
【发布时间】:2021-05-12 14:37:54
【问题描述】:

在一些数据争论中遇到了困难。我试图在书目数据框中只保留某些作者的机构隶属关系,并用 NA 替换许多不需要的隶属关系。我需要跨多个列执行此操作,因为论文有多个作者(最多 68 位)。

可重现的代码:

so <- data.frame(inst_1=c("FC1","FC2","Uni1","lab3","lab2"),
                 inst_2=c("FC1","FC5","college4","laboratory1","lab2"),
                 inst_3=c("FC2","FC2","University2","lab5","lab5"),
                 inst_4=c("FC3","FC6","dept2","lab3.2","lab1"),
                 inst_5=c("FC1","FC2","Uni3","labB","lab5"))

示例数据框:

 inst_1      inst_2      inst_3 inst_4 inst_5
1    FC1         FC1         FC2    FC3    FC1
2    FC2         FC5         FC2    FC6    FC2
3   Uni1    college4 University2  dept2   Uni3
4   lab3 laboratory1        lab5 lab3.2   labB
5   lab2        lab2        lab5   lab1   lab5

我想选择具有前缀“inst”的每一列(可能使用 str_detect),并在这些选择的列中替换任何包含字符“FC”的机构和 NA。这是必要的,因为此工作表有 68 个机构列(inst 前缀)和数百行(个别科学文章)。我不能只选择用 NA 替换哪些机构,因为有数百个不同的机构,而我只想保留包含“FC”的机构。

【问题讨论】:

    标签: r if-statement dplyr data-wrangling


    【解决方案1】:

    1) dplyr 像这样使用 mutate/cross

    library(dplyr)
    
    so %>% 
      mutate(across(starts_with("inst"), ~ replace(., !grepl("FC", .), NA)))
    

    给予:

      inst_1 inst_2 inst_3 inst_4 inst_5
    1    FC1    FC1    FC2    FC3    FC1
    2    FC2    FC5    FC2    FC6    FC2
    3   <NA>   <NA>   <NA>   <NA>   <NA>
    4   <NA>   <NA>   <NA>   <NA>   <NA>
    5   <NA>   <NA>   <NA>   <NA>   <NA>
    

    2) 基础 R 或仅使用基础 R:

    ok <- startsWith(names(so), "inst")
    repl <- function(x) replace(x, !grepl("FC", x), NA)
    replace(so, ok, lapply(so[ok], repl))
    

    3) 折叠 或将折叠包与 (2) 中的 repl 一起使用

    library(collapse)
    
    tfmv(so, startsWith(names(so), "inst"), repl)
    

    4) data.table 我们使用 data.table 定义了一个 inst 名称向量,并将其与 (2) 中的 repl 一起使用。

    library(data.table)
    
    DT <- as.data.table(so)
    inst <- grep("^inst", names(so))
    DT[, (inst) := lapply(.SD, repl), .SDcols = inst]
    

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2021-12-31
      • 2022-10-17
      • 2020-03-24
      相关资源
      最近更新 更多