【问题标题】:Is there a vectorized method for replacing factor levels in tidyverse是否有用于替换 tidyverse 中的因子水平的矢量化方法
【发布时间】:2021-03-18 03:44:55
【问题描述】:

我希望能够通过用变量(列)的名称替换其中一个级别来有效地重新编码数据框的大量变量(列)的因子级别。

Health <- tibble(Anemia = c("yes", "no", "no"), 
BloodPressure = c("no", "yes", "no"),
Asthma = c("no", "no", "yes"))

我希望输出看起来像这样

Health2 <- tibble(Anemia = c("Anemia", "no", "no"), 
BloodPressure = c("no", "BloodPressure", "no"), 
Asthmal = c("no", "no", "Asthma"))

我想要这个输出而不需要手动更改每个级别,因为我有一个包含 100 个左右变量的数据库,我必须重新编码。我试图创建一个函数来做到这一点

Med_rename <- function(x) {
  levels = c(no = "no", names(x) ="yes")
  fct_recode(x, !!!levels)
}

Med_rename2 <- function(x) {
  y = names(x)
  levels = c(no = "no", y ="yes")
  fct_recode(x, !!!levels)
}

但是这些尝试中的任何一个或其他使用矢量化尝试替换级别的尝试的输出都不会用变量(列)名称替换“是”。是否有另一种矢量化方式来用列名替换“是”并应用于大量变量?

【问题讨论】:

    标签: r function refactoring vectorization forcats


    【解决方案1】:

    您可以在dplyr 中使用cur_column() 来使用要替换的列名。

    library(dplyr)
    
    Health %>% mutate(across(.fns = ~replace(., . == 'yes', cur_column())))
    
    #  Anemia BloodPressure Asthma
    #  <chr>  <chr>         <chr> 
    #1 Anemia no            no    
    #2 no     BloodPressure no    
    #3 no     no            Asthma
    

    在基础 R 中,带有 lapply

    Health[] <- lapply(names(Health), function(x) 
                       replace(Health[[x]], Health[[x]] == 'yes', x))
    

    【讨论】:

    • 非常感谢您的帮助。 lapply 解决方案可以正常工作。不幸的是,dplyr 解决方案引发了以下错误:Error in Health(.) : could not find function "Health"
    • 您确定要复制与我的答案相同的代码吗?使用您帖子中的数据,我没有收到任何此类错误。
    • 是的,我完全复制了代码。我重新启动了我的 R 项目,它在重新创建原始 tibble 后工作。该错误似乎与我的原始数据集中的缺失值有关。一旦我删除它,就没有更多的错误了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多