Je travaille avec des données météorologiques et j'essaie de trouver la première fois qu'une température est négative pour chaque saison d'hiver. J'ai une base de données avec une colonne pour la saison d'hiver (1, 2, 3, etc.), la température et l'ID.
Je peux obtenir la première fois que la température est négative avec ce code:
season id_firstnegative [1,] 1 2 [2,] 2 4 [3,] 3 8 [4,] 4 10 [5,] 5 13
mais il ne renvoie que la première valeur, et non une pour chaque saison. p >
Je sais que j'ai besoin de group_par saison, mais comment puis-je intégrer cela?
Par exemple,
season<-c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5) temp<-c(2,-1,0,-1,3,-1,0,-1,2,-1,4,5,-1,-1,2) ID<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) df <- cbind(season,temp,ID)
Idéalement, je veux une table qui ressemble à ceci d'après le code factice ci-dessus: table
FirstNegative <- min(which(df$temp<=0))
3 Réponses :
Comme vous l'avez dit, je pense que vous pouvez résoudre ce problème en regroupant simplement la saison et en examinant le premier index des identifiants inférieurs à zéro dans ce groupe . Cependant, l'ordre de vos données sera important, alors assurez-vous que chaque saison a le bon ordre avant d'utiliser cette solution possible.
# A tibble: 5 x 2 # Groups: season [5] season firstNeg <dbl> <dbl> 1 1 2 2 2 4 3 3 8 4 4 10 5 5 13
Cela fournira un résultat comme:
library(dplyr) library(tibble) season<-c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5) temp<-c(2,-1,0,-1,3,-1,0,-1,2,-1,4,5,-1,-1,2) ID<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) df<- tibble(season,temp,ID) df <- df %>% group_by(season) %>% mutate(firstNeg = ID[which(temp<0)][1]) %>% distinct(season, firstNeg) # Combine only unique values of these columns for reduced output
Essayez summary
au lieu de mutate
, cela rendrait la partie distinct
obsolète
Très vrai; J'ai gardé mutate
dans le processus, il était donc facile de regarder en arrière et de voir à quoi ressemblait firstNeg
avant de s'effondrer. Mais oui, ce n'est pas nécessaire si l'on veut seulement le tableau récapitulatif final.
Une option base R
utilisant sous-ensemble
et aggregate
aggregate(ID ~ season, subset(df, temp < 0), head, 1) # season ID #1 1 2 #2 2 4 #3 3 8 #4 4 10 #5 5 13
library(dplyr) season<-c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5) temp<-c(2,-1,0,-1,3,-1,0,-1,2,-1,4,5,-1,-1,2) ID<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) df<-as.data.frame(cbind(season,temp,ID)) df %>% dplyr::filter(temp < 0) %>% group_by(season) %>% dplyr::filter(row_number() == 1) %>% ungroup()
Cela suggère une traduction data.table vraiment soignée de df [temp <0,. (Firstneg = .I [1]), by = season]
@ arg0naut91 -
which.min
ne donnera pas le résultat correct s'il y a des valeurs inférieures à la première fois qu'une température négative a été notée.Merci @thelatemail, j'ai oublié cela - alors ce n'est pas une dupe complète.