#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
значения. Код, который вы скопировали выше, по умолчанию использует половину данных, игнорируя среднее значение, если имеется нечетное число наблюдений (которое всегда будет равно нулю, потому что это будет само значение минус).