【问题标题】:R: Mutate across multiple variables with quantcutR:使用 quantcut 跨多个变量进行变异
【发布时间】:2022-01-20 05:53:54
【问题描述】:

我想使用 quantcut 将多个变量转换为离散形式。

library(gtools)
library(dplyr)

quantcut(df$var3, q=4, na.rm = TRUE) 

工作。

现在我想将此公式应用于多个变量。我所拥有的是这样的:

var_col <- c(var3, var4, var5, var6) 
df <- df %>% 
     mutate(across(all_of(var_col), quantcut(., q=4, na.rm = TRUE, .names = "cut_{col}"))

这给我带来了错误:“x can't combine year and country 。错误发生在第一组:year = 1800。

数据集如下所示:

country <- c("GER", "ITA", "FRA") 
year <- c("1800", "1801", "1802") 
var3 <- c(1L, 2L, 3L) 
var4 <- c(3L, 4L, 5L) 
var5 <- c(6L, 7L, NA) 
var6 <- c(8L, 9L, 10) 
df <- data.frame(country, year, var3, var4, var5, var6) 

虽然我应该说,我尝试使用 reprex 我得到了一个不同的错误:“x non-numeric argument to binary operator”所以我猜变量类型不同,我会尝试找到一种方法来精确复制我的错误。

【问题讨论】:

    标签: r database quantile mutated


    【解决方案1】:

    也许这就是你所追求的?:

    library(dplyr)
    
    country <- c("GER", "ITA", "FRA") 
    year <- c("1800", "1801", "1802") 
    var3 <- c(1L, 2L, 3L) 
    var4 <- c(3L, 4L, 5L) 
    var5 <- c(6L, 7L, NA) 
    var6 <- c(8L, 9L, 10) 
    df <- data.frame(country, year, var3, var4, var5, var6) 
    
    your_func <- function(x){
      gtools::quantcut(x, q=4, na.rm = TRUE)
    }
    
    df %>% 
      mutate(across(where(is.numeric), your_func))
    

    输出:

      country year    var3    var4     var5     var6
    1     GER 1800 [1,1.5] [3,3.5] [6,6.25]  [8,8.5]
    2     ITA 1801 (1.5,2] (3.5,4] (6.75,7]  (8.5,9]
    3     FRA 1802 (2.5,3] (4.5,5]     <NA> (9.5,10]
    

    编辑

    如果需要指定哪些列:

    var_col <- c("var3", "var4", "var5", "var6") 
    
    df %>% 
      mutate(across(var_col, your_func))
    

    输出同上。

    【讨论】:

    • 嗨@Kjetil,非常感谢您的回复。对不起——我应该澄清一下。数据集中有超过 1000 个变量,我想在大约 15 个变量上执行这个突变。有没有办法在指定这样一个 varlist 的同时做到这一点?
    • 希望我刚刚所做的编辑是你在@PierreRoubaix 之后的样子
    • 嗨@Kjetil,感谢您的帮助!这是我得到的错误:错误:mutate() 输入问题..1。我..1 = across(var_col, your_func .names = "cut2_{col}")。 x 间隔数无效 i 第 1 组中发生错误:年 = 1800。也许我需要更好的表示,但我仍然不明白为什么会出现问题。我以类似的方式运行了一个类似的 mutate 函数(在变量列表中,虽然按年份分组),但没有遇到这个问题。
    • 不幸的是,当我无法重现错误时,我很难提供帮助。无论如何,祝你好运,周末愉快:)
    • 分组的错误可能没有发生,因为数据集仍然按年份分组。使用 ungroup() 在管道之后再试一次。
    【解决方案2】:

    因为yearcountry 的值不连续,所以出现错误。包文档明确指出x 必须是“连续变量”。欲了解更多信息,请使用?quantcut 或访问:https://www.rdocumentation.org/packages/gtools/versions/3.9.2/topics/quantcut

    您可以通过使用as.integer()year 转换为整数来为year 解决这个问题。 country 但是不能在不丢失信息的情况下转换为连续变量。 quantcut() 也不适用于因子。如果可以选择,您可以尝试将 country 排除在突变之外?

    【讨论】:

    • 嗨@Adriaan Nering Boegel,感谢您的回复。但是,我没有将它们包含在突变中,它们不是我的 varlist 的一部分——它们只是我的数据集的一部分。我根本不想将它们分成分位数,这就是为什么我对它们导致错误感到困惑的原因。但是,它们是数据集中的前 2 列。这让我觉得变异是从“开始”而不是我指定的变量列表开始的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2012-01-12
    • 2017-05-18
    • 2010-10-27
    • 2022-01-16
    相关资源
    最近更新 更多