在 R 中使用带有 lapply/sapply 的匿名函数?

Using anonymous functions with lapply/sapply in R?

我正在尝试使用 sapply 获取列表中的每个项目(例如 "Golf"、"Malibu"、"Corvette")并创建一个具有最高值的新列表列表从中拆分出来的数据框(例如 cars$sale_price)。我正在尝试使用匿名函数来执行此操作,但我无法使该函数正常工作。

这里的基本问题是我不太擅长编写函数。

首先,我采用了原始数据框 cars 并使用 split 创建了一个独特的汽车名称列表 - 我称之为 car_names

现在,我正在尝试使用 sapply 创建一个新列表,列出列表中每种汽车的最高售价。我确定我正在正确地开始这件事...

price_list <- sapply(car_names, 

...但我一辈子都无法获得一个匿名函数来简单地将 max 应用于 cars$sale price 中每个汽车名称的所有实例。

我尝试了很多东西,但都返回了错误。这是一个例子:

price_list <- sapply(car_names, function(x) {
    max(cars$saleprice[x])
})

哪个returns:

Error in h115$nominate_dim1[x] : invalid subscript type 'list'

我敢肯定,即使对于经验丰富的程序员来说,这也是微不足道的,但我……不是其中之一!我怀疑我指向的东西不正确,但我无法通过它。有什么想法吗?


编辑:这是一个可重现的例子。

首先,"source" 数据框:

cars1 <- data.frame("car_names" = c("Corvette", "Corvette", "Corvette", "Golf", "Golf", "Golf", "Malibu", "Malibu", "Malibu"),"saleprice" = c(32000,45000,72000,7500,16000,22000,33000,21000,26500))

接下来,将 df 拆分 car_names:

cars1_split <- split(cars1, cars1$car_names)

现在,尝试将 max 传递给 sapply 并出现错误:

maxes <- sapply(cars1_split, function(x){
  max(cars1$saleprice[x])
})

希望这能给你们一些有用的东西!

这里有几个选项,让我们从 aggregate 开始 - 不是您要求的,但我想引起您的高度关注;)

aggregate(saleprice ~ car_names, cars1, max)
#  car_names saleprice
#1  Corvette     72000
#2      Golf     22000
#3    Malibu     33000

Returns一个data.frame(如果你需要一个列表,你可以很容易地split

aggregatetapply 类似

tapply(cars1$saleprice, cars1$car_names, FUN = max)
#Corvette     Golf   Malibu 
#   72000    22000    33000

或尝试 bywhich.max

by(cars1, cars1$car_names, FUN = function(x) x[which.max(x$saleprice), ])
#cars1$car_names: Corvette
#  car_names saleprice
#3  Corvette     72000
#-------------------------------
#cars1$car_names: Golf
#  car_names saleprice
#6      Golf     22000
#-------------------------------
#cars1$car_names: Malibu
#  car_names saleprice
#7    Malibu     33000

最后,您还可以使用 lapplysplitby 有点 shorthand)

lapply(split(cars1, cars1$car_names), function(x) x[which.max(x$saleprice), ])
#$Corvette
#  car_names saleprice
#3  Corvette     72000

#$Golf
#  car_names saleprice
#6      Golf     22000

#$Malibu
#  car_names saleprice
#7    Malibu     33000