Извините, если я неправильно отформатировал это или заголовок не совсем правильный, я новичок в 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.