在R中对lapply / sapply使用匿名函数?

时间:2019-01-11 18:01:04

标签: r lapply anonymous-function sapply

我正在尝试使用sapply来获取列表中的每个项目(例如“高尔夫”,“马里布”,“克尔维特”),并创建一个新列表,该列表在列表从中分离出来的数据框中具有最高的值(例如cars $ sale_price)。我正在尝试使用匿名函数来执行此操作,但是我无法使该函数正常工作。

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

首先,我使用原始数据框汽车,并使用split创建了一个唯一的汽车名称列表-我将其称为 car_names

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

price_list <- sapply(car_names, 

...但是我无法终生获得一个匿名函数,以简单地将max应用于汽车价格中每个汽车名称的所有实例。

我尝试了很多东西,所有这些都返回了错误。这是一个示例:

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

哪个返回:

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

我敢肯定,即使是经验丰富的程序员,这也是简单的事情,但是我...不是其中之一!我怀疑我指的是不正确的东西,但我无法超越它。有什么想法吗?


编辑:这是一个可复制的示例。

首先,“源”数据框:

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))

接下来,用car_names分割df:

cars1_split <- split(cars1, cars1$car_names)

现在,尝试将max传递到sapply并收到错误消息:

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

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

1 个答案:

答案 0 :(得分:0)

您在这里有一些选择,让我们从aggregate开始-不是您要的,但我想引起您的高度关注;)

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

返回一个data.frame(如果需要列表,您可以轻松地split

aggregate类似于下一个tapply

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的缩写)

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