Сообщение об ошибке: нет аргументов для max; возвращение -Inf - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь определить ширину на половине высоты графика плотности, и в предыдущем сообщении я обнаружил следующий код:

  d <- ggplot(A0, aes(DIAMETER)) +
  geom_density()

xmax <- d$x[d$y==max(d$y, na.rm = TRUE)]
x1 <- d$x[d$x < xmax][which.min(abs(d$y[d$x < xmax]-max(d$y)/2))]
x2 <- d$x[d$x > xmax][which.min(abs(d$y[d$x > xmax]-max(d$y)/2))]
FWHM <- x2-x1

, когда я его выполняю, хотя получаю следующее сообщение об ошибке относительно к функции max ()

Warning message:
In max(d$y, na.rm = TRUE) : no non-missing arguments to max; returning -Inf

Я немного огляделся и увидел, что это могло быть связано с наличием значения NA в моем наборе данных, но это не так (структура кадра данных ниже). Кто-нибудь знает, как я могу решить эту проблему? заранее спасибо!

str(A0)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   387 obs. of  3 variables:
 $ SAMPLE  : Factor w/ 5 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ TIME    : Factor w/ 3 levels "0","24","72": 1 1 1 1 1 1 1 1 1 1 ...
 $ DIAMETER: num  13.57 3.76 10.67 14.74 4.2 ...

1 Ответ

2 голосов
/ 25 мая 2020

Я думаю, вы, возможно, неверно истолковываете найденный вами код. У объекта ggplot просто нет члена с именем y. Предположим, мы построили график плотности следующим образом:

library(ggplot2)

set.seed(69)
d <- ggplot(data = data.frame(x = rnorm(100)), aes(x)) + geom_density()
d

enter image description here

Мы можем воспроизвести вашу ошибку следующим образом:

xmax <- d$x[d$y==max(d$y, na.rm = TRUE)]
#> Warning message:
#> In max(d$y, na.rm = TRUE) : no non-missing arguments to max; returning -Inf

И если мы попытаемся посмотреть на d$y, мы получим:

d$y
#> NULL

Если вы хотите работать с базовыми данными из графика, вам нужно использовать ggbuild, например:

p <- ggplot_build(d)

Теперь p содержит список фреймов данных, по одному для каждого графического слоя, поэтому в нашем случае мы можем сделать:

df <- p$data[[1]]

Теперь df - это фрейм данных, содержащий наши x и y координаты, чтобы мы могли запустить ваш алгоритм

xmax <- df$x[df$y==max(df$y, na.rm = TRUE)]
x1 <- df$x[df$x < xmax][which.min(abs(df$y[df$x < xmax]-max(df$y)/2))]
x2 <- df$x[df$x > xmax][which.min(abs(df$y[df$x > xmax]-max(df$y)/2))]
FWHM <- x2-x1

FWHM
#> [1] 2.100466

и убедиться, что этот расчет верен, построив отрезок между значениями x1 и x2 на половине максимальной высоты:

 d + geom_segment(aes(x = x1, xend = x2, y = max(df$y)/2, yend = max(df$y)/2), 
                  linetype = 2, colour = "red")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...