R вычтите min из max, второе по величине из второго по величине и т. Д

#r

Вопрос:

Есть ли более эффективный / лучший способ использовать эту функцию, либо сделав ее более гибкой, либо используя набор глаголов dplyr, о которых я не знаю?

Я беру вектор (mtcars$mpg), сохраняю его как переменную и запускаю через эту функцию — эта функция вычитает наименьшее значение из наибольшего значения и второе по величине значение из второго по величине значения и т. Д. Если длина(mtcars$mpg) нечетна, то в ней также должно быть опущено среднее значение, но я не знаю, как включить эту часть.

 vector <- function(myvector) {
  first_value <- sort(myvector)[32] - sort(myvector)[1]
  second_value <- sort(myvector)[31] - sort(myvector)[2]
  third_value <- sort(myvector)[30] - sort(myvector)[3]
  fourth_value <- sort(myvector)[29] - sort(myvector)[4]
  fifth_value <- sort(myvector)[28] - sort(myvector)[5]
  sixth_value <- sort(myvector)[27] - sort(myvector)[6]
  seventh_value <- sort(myvector)[26] - sort(myvector)[7]
  eighth_value <- sort(myvector)[25] - sort(myvector)[8]
  ninth_value <- sort(myvector)[24] - sort(myvector)[9]
  tenth_value <- sort(myvector)[23] - sort(myvector)[10]
  eleventh_value <- sort(myvector)[22] - sort(myvector)[11]
  twelfth_value <- sort(myvector)[21] - sort(myvector)[12]
  thirteenth_value <- sort(myvector)[20] - sort(myvector)[13]
  fourteenth_value <- sort(myvector)[19] - sort(myvector)[14]
  fifteenth_value <- sort(myvector)[18] - sort(myvector)[15]
  sixteenth_value <- sort(myvector)[17] - sort(myvector)[16]
  return(c(first_value, second_value, third_value, fourth_value, fifth_value, sixth_value, seventh_value, eighth_value, ninth_value, tenth_value, eleventh_value, twelfth_value, thirteenth_value, fourteenth_value, fifteenth_value, sixteenth_value))
  }

myvector <- mtcars$mpg
myvector

vector(myvector)
 

Ответ №1:

Следуя мудрому совету @r2evans и облекая его в форму функции:

 maxtomin <- function(vec, N = NULL) {
    if(is.null(N)) {N <- floor(length(vec)/2)}
    vec <- sort(vec)
    vecfin <- rev(vec) - vec
    return(head(vecfin, N))
}
maxtomin(mtcars$mpg)
 

Комментарии:

1. Вы можете сэкономить некоторую обработку (так sort как для больших векторов требуется время), вы можете использовать myvector1 <- rev(myvector) или просто использовать finalvector <- myvector - rev(myvector) .

2. это отличные ответы, спасибо вам всем, что делает эта часть? если(равно.null(N)) {N

3. Это позволяет вам принимать первые N значения. Код, который вы скопировали выше, по умолчанию использует половину данных, игнорируя среднее значение, если имеется нечетное число наблюдений (которое всегда будет равно нулю, потому что это будет само значение минус).