Как считать значения Max для ряда переменных и сформировать среднее значение, используя пространственно близкие значения в R? - PullRequest
0 голосов
/ 29 марта 2019

Извините, ниже приведен 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).

Я представляю код, похожий на что-то вроде этого (я знаю, что вы пишете не так, но я незнать лучше):

среднее (максимальное значение в переменной, значение в точке x (максимального значения в переменной) -1, y (максимального значения в переменной)), значение в точке x (максимального значения в переменной)-1, y (с максимальным значением в переменной) +1) .....

Следующая проблема состоит в том, что инструмент выполнит сканирование 96 областей (= "переменных").И в идеале мне нужно решение, которое автоматически дает мне это специальное среднее значение для каждой / всех переменных без необходимости писать почти идентичный код 96 раз.

Я знаю, что это требует много, но я работал надэто на некоторое время, и я просто не могу придумать решение или даже хороший способ найти его.

Большое спасибо за любую помощь!

Тим,

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 Ответ

0 голосов
/ 29 марта 2019

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