1
votes

Comment trouver la première occurrence d'une valeur négative pour chaque facteur

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))  


2 commentaires

@ 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.


3 Réponses :


2
votes

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


2 commentaires

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.



2
votes

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


0 commentaires

2
votes
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()


1 commentaires

Cela suggère une traduction data.table vraiment soignée de df [temp <0,. (Firstneg = .I [1]), by = season]