【问题标题】:Can I create a function that compares numbers of a column to a mean for different columns?我可以创建一个将列数与不同列的平均值进行比较的函数吗?
【发布时间】:2020-06-01 20:41:30
【问题描述】:

对于 6 个不同的列,我必须将所有值更改为“高”/“低”,具体取决于这些值是大于还是小于列的平均值。我编写了一个函数来检查列中的值是否小于/大于平均值,但它仅适用于其中一列:

calc.binary <- function(number){
  number[number > mean(modality$auditory)] <- 'high'
  number[!(number %in% 'high')] <- 'low'
  number
}

modality_bin <- mutate_at(modality, vars(auditory:visual), list(calc.binary))

我现在想一次将此函数应用于所有 6 列(从听觉到视觉的列),但我知道我必须为此更改 calc.binary 函数。如何更改函数以获取每列的平均值并将该列中的数字与该平均值进行比较?所以我可以将相同的功能应用于所有列。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用:

    library(dplyr)
    modality %>% 
        mutate_at(vars(auditory:visual), ~ifelse(. > mean(.), "higher", "lower"))
    

    【讨论】:

      【解决方案2】:

      你应该可以在 Base-R 中使用apply 函数

      apply(modality[,c(2:5)], 2,function(x) ifelse(x > mean(x),'high','low'))
      

      其中modality[,c(2:5,8)] 是您传递给函数的数据,因此通过更改c(2:5,8) 中的值来选择您想要的列。如果您希望在每一列上都这样做,那么apply(modality, ... 就足够了。

      这里apply( ,2 , )2表示我们要逐列运行我们的函数。 1 表示逐行。

      【讨论】:

        【解决方案3】:

        lapply() 的解决方案如下所示,以mtcars 数据集为例。我们使用数字向量来处理mtcars 的列,并将mtcars 的引用作为lapply() 的第二个参数添加。我们创建比较,重命名列,并与原始数据合并。

        meansCompares <- lapply(1:ncol(mtcars),function(x,y){
             ifelse(y[x] >= mean(y[[x]]),"High","Low")
        },mtcars)
        compares <- do.call(cbind,meansCompares)
        # rename cols so we can join with original data 
        colnames(compares) <- paste0("comp_",colnames(compares))
        head(cbind(mtcars,compares))
        

        ...和输出:

        > head(cbind(mtcars,compares))
                           mpg cyl disp  hp drat    wt  qsec vs am gear carb comp_mpg comp_cyl comp_disp comp_hp comp_drat
        Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4     High      Low       Low     Low      High
        Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4     High      Low       Low     Low      High
        Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1     High      Low       Low     Low      High
        Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1     High      Low      High     Low       Low
        Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2      Low     High      High    High       Low
        Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1      Low      Low       Low     Low       Low
                          comp_wt comp_qsec comp_vs comp_am comp_gear comp_carb
        Mazda RX4             Low       Low     Low    High      High      High
        Mazda RX4 Wag         Low       Low     Low    High      High      High
        Datsun 710            Low      High    High    High      High       Low
        Hornet 4 Drive        Low      High    High     Low       Low       Low
        Hornet Sportabout    High       Low     Low     Low       Low       Low
        Valiant              High      High    High     Low       Low       Low
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-23
          • 2015-03-12
          • 2018-06-27
          • 2020-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多