我可以创建一个将列数与不同列的平均值进行比较的函数吗?

时间:2020-06-01 11:31:23

标签: r

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

my_list = [14,13,13,14]

def list_check(my_list):

    if all(isinstance(i, int) and 12 <= i <= 20 for i in my_list):
        print("true")
        return True
list_check(my_list)

我现在想一次将此功能应用于所有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)) 函数。如何更改函数,使其取每列的平均值并将该列中的数字与该平均值进行比较?因此,我可以将相同的功能应用于所有列。

3 个答案:

答案 0 :(得分:1)

您可以使用:

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

答案 1 :(得分:1)

您应该能够在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表示逐行。

答案 2 :(得分:0)

使用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