Как создать подмножество элементов в нескольких фреймах данных, которые больше элементов в другом списке?

Извините, если я неправильно отформатировал это или заголовок не совсем правильный, я новичок в R и переполнении стека. Я работаю со списком (называемым климатом), который содержит 20 фреймов данных (из каждой провинции), в каждом из которых есть столбцы года, месяца, дня и температуры (а также некоторые другие данные). Я ищу строки, в которых температура превышает определенный порог, но этот порог меняется для каждой провинции. Мне удалось использовать lapply, чтобы найти пороговое значение для каждой провинции, но когда я пытаюсь использовать эти пороговые значения для поиска строк в данных, где температура превышает пороговое значение, выходные данные неверны. Мой код возвращает кучу чисел, но, похоже, они не связаны с тем, что они превышают пороговое значение, и я также не знаю, как заставить его возвращать всю строку, а не только значение температуры.

пример списка климата:

A <- data.frame("D" = c(1:30), "T" = c(sample(10:30, size = 30, replace = TRUE)))
B <- data.frame("D" = c(1:30), "T" = c(sample(4:22, size = 30, replace = TRUE)))
C <- data.frame("D" = c(1:30), "T" = c(sample(14:35, size = 30, replace = TRUE)))

climate <- list("Alist" = A, "Blist" = B, "Clist" = C)
climate

Я использовал lapply, чтобы найти порог,

thresh95 <- lapply(lapply(
  climate, `[[`, 2), # this one takes my list of climate data and selects the T column for all provinces
  quantile, probs = c(0.95), na.rm = TRUE) # this one takes the previous list and finds 95th percentile value
thresh95

но когда я пытаюсь найти температуру выше порога, что-то идет не так.

tmax95 <-  lapply(lapply(climate, `[[`, 2), # this one takes my list of climate data and selects the T column for all provinces
  function(x) x[which(x>thresh95)])# this one takes my list of climate data and selects the temps that are greater than the threshold
tmax95

Есть ли способ написать что-то, что будет возвращать подмножество фрейма данных каждой провинции, где условием является то, что температура превышает пороговое значение? Спасибо!

Будьте осторожны, называя переменные «T», поскольку в определенных ситуациях R может интерпретировать их как TRUE.

Edward 09.08.2024 09:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен mapply.

Но сначала всегда устанавливайте начальное значение при моделировании данных.

set.seed(1234)

A <- data.frame("D" = c(1:30), "T" = c(sample(10:30, size = 30, replace = TRUE)))
B <- data.frame("D" = c(1:30), "T" = c(sample(4:22, size = 30, replace = TRUE)))
C <- data.frame("D" = c(1:30), "T" = c(sample(14:35, size = 30, replace = TRUE)))

mapply(\(x,y) x[which(x[,2] > y),], x=climate, y=thresh95, SIMPLIFY=FALSE)

$Alist
    D  T
19 19 30

$Blist
[1] D T
<0 rows> (or 0-length row.names)

$Clist
    D  T
17 17 35

Спасибо! Что означает установка семени?

user26711711 09.08.2024 09:22

Вы использовали функцию sample, которая генерирует случайные данные. Это помогает другим воспроизвести ваши и мои результаты. Без set.seed() мы все получили бы разные результаты.

Edward 09.08.2024 09:23

В чем дело?

Ваш thres95 — это список типа

> thresh95
$Alist
95%
 29

$Blist
95%
 22

$Clist
95%
 34

но x — это всего лишь вектор. Итак, у вас есть ошибка при подаче заявки x > thresh95

Вариант обхода

Вы можете запустить код ниже (данные взяты из @Edward)

lapply(
  climate,
  function(x) {
    subset(
      x,
      T > quantile(T, probs = 0.95)
    )
  }
)

что дает

$Alist
    D  T
19 19 30

$Blist
[1] D T
<0 rows> (or 0-length row.names)

$Clist
    D  T
17 17 35

Очень умный. Вы поняли, что творить thresh95 не нужно. ;)

Edward 09.08.2024 09:46

@Эдвард, ха-ха, я просто фанат коротких кодов.

ThomasIsCoding 09.08.2024 09:49

Другие вопросы по теме