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