【问题标题】:Customize lapply() in R在 R 中自定义 lapply()
【发布时间】:2020-09-14 14:37:24
【问题描述】:

我要自定义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 

提前多谢

【问题讨论】:

  • mean 将向量作为输入。您的函数将 data.frame 作为输入。 lapply 仅接受作为 FUN 传递的函数中的前者。

标签: r dplyr tidyverse lapply data-manipulation


【解决方案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

reprex package (v0.3.0) 于 2020 年 5 月 27 日创建

【讨论】:

  • 您可以将unlist +lapply 替换为sapply
  • @RonakShah 我认为你不能在这种情况下,因为从函数返回不同长度的元素。在这种情况下,sapply 不会自动将它们连接到一个向量中。例如,尝试sapply(list(1, 2), function(x) if(x == 1) 1 else 1:2)
  • 我猜你是对的。我没有仔细研究这个。
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多