我正在尝试使用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])
})
希望这能给你们一些有用的东西!
答案 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
或者尝试by
和which.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
最后,您还可以使用lapply
和split
(by
的缩写)
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