Настроить lapply() в R

Я хочу настроить lapply(df, FUN = mean)

это отлично работает,

mtcars
means.mtcars <- lapply(mtcars, FUN = mean)

но я хочу увидеть prop.table(table(df$column)) и сохранить их как другую строку на основе разных уровней

mtcars$gear1 <- factor(mtcars$gear, levels = c(3,4,5))

my.mean <- function(df) {
   ifelse(is.numeric(df)== T, mean(df),
   ifelse(df$gear1 == 3, df$newColumn1 ==  as.data.frame(prop.table(table(df$gear1)))[1, "Freq"],
      ifelse( df$gear1 == 4, df$newColumn2 ==  as.data.frame(prop.table(table(df$gear1)))[2, "Freq"],
              df$newColumn3 == as.data.frame(prop.table(table(df$gear1)))[3, "Freq"]  )))
}

not.working <- lapply(mtcars, FUN = my.mean)

Ожидаемые результаты означает .mtcars и в конце newColumn1,newColumn2,newColumn3

            V1
mpg   20.090625
cyl    6.187500
disp 230.721875
hp   146.687500
drat   3.596563
wt     3.217250
qsec  17.848750
vs     0.437500
am     0.406250
gear   3.687500
carb   2.812500
newColumn1  0.46875
newColumn2  0.37500
newColumn3  0.15625 

Спасибо заранее


person Seyma Kalay    schedule 27.05.2020    source источник
comment
mean принимает вектор в качестве входных данных. Ваша функция принимает data.frame в качестве входных данных. lapply принимает только первое из функции, переданной как FUN.   -  person Roland    schedule 27.05.2020


Ответы (1)


Когда вы используете lapply, вы применяете функцию к каждому столбцу изолированно в вашем фрейме данных. Проблема здесь в том, что вы хотите разделить один из столбцов на три, чего lapply не делает напрямую. Однако это легко обойти:

my.mean <- function(x) if(is.numeric(x)) mean(x) else prop.table(table(x))
setNames(as.data.frame(unlist(lapply(mtcars, FUN = my.mean))), "mean")
#>               mean
#> mpg      20.090625
#> cyl       6.187500
#> disp    230.721875
#> hp      146.687500
#> drat      3.596563
#> wt        3.217250
#> qsec     17.848750
#> vs        0.437500
#> am        0.406250
#> gear      3.687500
#> carb      2.812500
#> gear1.3   0.468750
#> gear1.4   0.375000
#> gear1.5   0.156250

Создана 27 мая 2020 г. в пакете reprex (v0.3.0)

person Allan Cameron    schedule 27.05.2020
comment
Вы можете заменить unlist +lapply на sapply. - person Ronak Shah; 27.05.2020
comment
@RonakShah Я не думаю, что вы можете в этом случае, потому что из функции возвращаются элементы разной длины. В этом случае sapply не будет автоматически объединять их в вектор. Например, попробуйте sapply(list(1, 2), function(x) if(x == 1) 1 else 1:2) - person Allan Cameron; 27.05.2020
comment
Мне кажется, ты прав. Я не рассматривал это очень подробно. - person Ronak Shah; 27.05.2020