Использование анонимных функций с lapply / sapply в R? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь использовать sapply, чтобы взять каждый элемент в списке (например, «Гольф», «Малибу», «Корвет») и создать новый список с самым высоким значением в кадре данных, из которого был разбит список (например, автомобили $ SALE_PRICE). Я пытаюсь использовать анонимную функцию для этого, но я не могу заставить эту функцию работать.

Основная проблема в том, что я не очень хорош в написании функций.

Сначала я взял исходный фрейм данных cars и использовал 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))

Далее, разделив df по именам машин:

cars1_split <- split(cars1, cars1$car_names)

Теперь, пытаясь передать max в sapply и получить ошибку:

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

Надеюсь, это даст вам, ребята, кое-что для работы!

1 Ответ

0 голосов
/ 11 января 2019

У вас есть несколько вариантов здесь, давайте начнем с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...