Как считывать максимальные значения для ряда переменных и формировать среднее значение, используя пространственно близкие значения в R?

#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 — 59

(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, чтобы я мог попытаться внести свой вклад в сообщество в будущем! Спасибо!!