#r #sorting
#r #сортировка
Вопрос:
Эй, ниже приведен df, похожий на тот, с которым мне приходится работать, но намного меньше: (я опустил много строк, чтобы было удобнее для глаз.)
x y variable values
1 1 5 a 9
2 2 5 a 2
3 3 5 a 9
4 4 5 a 8
5 5 5 a 4
...
22 2 1 a 7
23 3 1 a 9
24 4 1 a 7
25 5 1 a 10
26 1 5 b 7
27 2 5 b 8
...
48 3 1 b 8
49 4 1 b 7
50 5 1 b 2
Df, приведенный выше, создается считывателем флуоресцентных пластин, который сканирует интенсивность света в пределах области, разделяя ее на 25 секторов (5×5) и измеряя каждый сектор по отдельности, выдавая каждому по одному значению. Порядок измерений — сначала верхний левый угловой сектор, а последним нижний правый угловой сектор. Чтобы сделать его более графичным:
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Заполняя значения из df, приведенные выше ( координаты), это будет выглядеть следующим образом:
(5) ___ 9 — 2 — 9 — 8 — 4
(4) ___ 7 — 7 — 2 — 5 — 3
(3) ___ 5 — 4 — 7 — 8 — 9
(2) ___ 6 — 6 — 3 — 5 — 9
(1) ___ 4 — 7 — 9 — 7 — 10
(y^,x>) (1) (2) (3) (4) (5)
Что мне нужно, так это считывать максимальное значение для каждой переменной и вычислять среднее значение этого значения и (до) 9 полей, окружающих его. В области / «переменной» выше («a») наибольшее значение сектора равно 10 в нижнем правом углу, который окружен значениями 5,9 и 7. Следовательно, результат, который я ищу для переменной «a», равен 7.75 ((5 9 7 10)/4).
Я представляю, что код должен напоминать что-то вроде этого (я знаю, что это не так, как вы пишете r, но я не знаю лучше):
среднее (максимальное значение в переменной, значение в x (от максимального значения в переменной) -1, y (от максимального значения в переменной)), значение в x (от максимального значения в переменной) -1, y (от максимального значения в переменной) 1)…..
Следующая проблема заключается в том, что инструмент будет выполнять сканирование 96 областей (= «переменные»). И в идеале мне нужно решение, которое автоматически выдает мне это специальное среднее значение для каждой / all переменных без необходимости писать почти идентичный код 96 раз.
Я знаю, что это требует немного многого, но я работал над этим некоторое время, и я просто не могу придумать решение или даже хороший способ его поиска в Google.
Большое вам спасибо за любую помощь!
Тим,
Ps: Использование этого R-кода создает случайную версию df, которую я представил выше:
df <- data.frame(x = c(1:5), y = rep(c(5:1), each=5),variable = rep(c("a", "b"), each=25 ), values = floor(runif(50, min=1, max=10)))
Комментарии:
1. Не могли бы вы, пожалуйста, использовать инструменты редактирования SO для улучшения читаемости вашего кода и текста? Я изо всех сил пытаюсь понять, что вы пытаетесь сделать.
2. Спасибо. Я бы с удовольствием, но, видимо, даже это выше моих сил. Однако я принял ваши предложения по улучшению. TA
Ответ №1:
Этот обновленный ответ предоставит среднее значение максимального значения, и это до 9 окружающих значений в каждой группе переменных.
library(dplyr)
# Create the function
get.means <- function(df){
# Get a data frame of rows with the maximum value
max.rows <- df[df$values == max(df$values), ]
# Create an empty data frame
means.df <- data.frame(variable = character(), x = integer(), y = integer(), value = numeric(), mean = numeric(), stringsAsFactors = FALSE)
# Create an iterator for the data frame
iterator <- 1
# Loop through each row of the maximum value data frame
for(i in c(1:nrow(max.rows))){
# Get the x value for the current row
x <- max.rows$x[i]
# Get the y value for the current row
y <- max.rows$y[i]
# Set the range of x values to process based on the x coordinate
if(x == 1){
x.range <- c(1, 2)
} else if(x == 5){
x.range <- c(4, 5)
} else{
x.range <- c(x-1, x, x 1)
}
# Set the range of y values to process based on the y coordinate
if(y == 1){
y.range <- c(1, 2)
} else if(y == 5){
y.range <- c(4, 5)
} else{
y.range <- c(y-1, y, y 1)
}
# Get a matrix of the values from the original data frame, which are in both the current y and x ranges
vals <- as.matrix(df[(df$y %in% y.range) amp; (df$x %in% x.range), 'values'])
# Get the mean of the values
mean.val <- mean(vals)
# Insert the current variable value to the data frame for the new row
means.df[iterator, 'variable'] <- as.character(max.rows$variable[i])
# Insert the current x, y, value, and mean values for the new row
means.df[iterator, c('x','y','value', 'mean')] <- c(x, y, max.rows$values[i], mean.val)
# Increment the iterator
iterator <- iterator 1
}
# Return the final data frame
return(means.df)
}
# Create a test data frame
df <- data.frame(x = c(1:5), y = rep(c(5:1), each=5),variable = rep(c("a", "b"), each=25 ), values = floor(runif(50, min=1, max=10)))
# Get the means for each max value within the variable grouping
df1 <- df %>%
group_by(variable) %>%
do(get.means(.))
Комментарии:
1. Большое вам спасибо за это предложение. Я действительно думаю, что все идет в правильном направлении. Тем не менее, это все еще оставляет меня с проблемой, что в конечном итоге мне нужно только одно значение для каждой переменной и иметь их все в одном df. Благодаря вам я понял, что мой пример был довольно ужасным. Не только было несколько максимальных значений, но и в примере вычисления, который я показал, даже не использовалось максимальное значение этого конкретного сектора. Я доработал свой пример и изменил формулировку. Я надеюсь, что теперь это намного понятнее. Может быть, вы могли бы взглянуть еще раз. Спасибо!! Тим
2. Я обновил свой ответ для работы с функцией dplyr
group_by
. Теперь он вернет фрейм данных, который имеет среднее значение для максимум 9 окружающих значений в каждой переменной. Примечание: Если существует привязка для максимального значения в группе переменных, то она вернет обе строки.3. Огоооо. Большое вам спасибо! Насколько я могу судить, это правильно. Единственное, что я могу предложить в ответ, это то, что я постараюсь улучшить кодирование, а также форматирование stackoverflow, чтобы я мог попытаться внести свой вклад в сообщество в будущем! Спасибо!!