在 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
)
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
有点 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
我正在尝试使用 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
)
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
有点 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