Извините, если я неправильно отформатировал это или заголовок не совсем правильный, я новичок в 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
Есть ли способ написать что-то, что будет возвращать подмножество фрейма данных каждой провинции, где условием является то, что температура превышает пороговое значение? Спасибо!





Вам нужен 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
Спасибо! Что означает установка семени?
Вы использовали функцию sample, которая генерирует случайные данные. Это помогает другим воспроизвести ваши и мои результаты. Без set.seed() мы все получили бы разные результаты.
Ваш 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 не нужно. ;)
@Эдвард, ха-ха, я просто фанат коротких кодов.
Будьте осторожны, называя переменные «T», поскольку в определенных ситуациях R может интерпретировать их как TRUE.