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

在R中使用带lappy/sapply的匿名函数?,r,lapply,anonymous-function,sapply,R,Lapply,Anonymous Function,Sapply,我正在尝试使用sapply将列表中的每一项(如高尔夫、马里布、克尔维特)提取出来,并创建一个新的列表,该列表在数据框中具有最高的价值,该数据框是从例如汽车$sale_price中拆分出来的。我正在尝试使用匿名函数来完成此操作,但无法使该函数正常工作 这里的基本问题是我不太擅长编写函数 首先,我使用原始的dataframe汽车,并使用split创建一个独特汽车名称的列表——我称之为汽车名称 现在,我正试图用sapply创建一个新列表,列出列表中每种车型的最高售价。我确信我的启动是正确的 price

我正在尝试使用sapply将列表中的每一项(如高尔夫、马里布、克尔维特)提取出来,并创建一个新的列表,该列表在数据框中具有最高的价值,该数据框是从例如汽车$sale_price中拆分出来的。我正在尝试使用匿名函数来完成此操作,但无法使该函数正常工作

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

首先,我使用原始的dataframe汽车,并使用split创建一个独特汽车名称的列表——我称之为汽车名称

现在,我正试图用sapply创建一个新列表,列出列表中每种车型的最高售价。我确信我的启动是正确的

price_list <- sapply(car_names, 
返回:

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

希望这能给你们一些合作的机会

你有几个选择,让我们从聚合开始——不是你要求的,但我想让你保持高度关注

aggregate(saleprice ~ car_names, cars1, max)
#  car_names saleprice
#1  Corvette     72000
#2      Golf     22000
#3    Malibu     33000
返回一个data.frame,如果需要列表,可以轻松拆分该data.frame

aggregate与tapply下一步类似

tapply(cars1$saleprice, cars1$car_names, FUN = max)
#Corvette     Golf   Malibu 
#   72000    22000    33000
或者试试哪个。max

最后,您还可以使用lappy和split,这在某种程度上是简写的

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

我认为问题在于“汽车名称”中的每个元素都是一个列表。如果x是一个列表,则maxcars$saleprice[x]将导致一个错误。我想这就是为什么你会出现错误,但除非你发布一个可复制的示例,否则你无法确定。你应该共享一个示例并显示预期的输出。你们是对的,@markus和@David Rosenman!谢谢你的反馈。我有一两个小时很忙,但很快就会和大家分享一个简单的可复制的例子。骨料太干净了!后续:如果我想做Lappy,就像你上一个例子,但现在我想计算平均销售价格而不是最大销售价格,我该怎么做?据我所知,没有which.mean,用mean替换which.max会给我一个混乱的矩阵。@logjammin很抱歉,您需要执行lapplysplitcars1、cars1$car\u name、functionx meanx$saleprice。但是你最好在这里使用聚合。
aggregate(saleprice ~ car_names, cars1, max)
#  car_names saleprice
#1  Corvette     72000
#2      Golf     22000
#3    Malibu     33000
tapply(cars1$saleprice, cars1$car_names, FUN = max)
#Corvette     Golf   Malibu 
#   72000    22000    33000
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(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