J'essaye d'indexer un vecteur en utilisant deux autres vecteurs. Je peux indexer à partir du premier vecteur sans problème, mais mon index conditionnel à partir de la deuxième valeur pose des problèmes.

Mon exemple de code est le suivant

h=rep(seq(1:24),90)
m=rep(1:3,each=24*30)
d=rep(1:30,each=24*3)

Mon objectif est d'utiliser match (ou une autre fonction si elle est mieux adaptée) pour déterminer quelles valeurs d'heure correspondent à toutes les instances dans lesquelles m = 1 ou m = 2 et d = 2 ou 3

Ma tentative est la suivante

hin=match(m,1)|(match(m,2)&match(d,2:3))

Dans ce cas, les éléments 1: 720 et 745: 793 doivent donner la valeur True, mais seulement 1: 720 sont TRUE. Comment exécuter la deuxième partie de l'argument ci-dessus afin que les valeurs ultérieures soient identifiées?

MODIFIER

Pour créer un exemple plus reproductible:

h2=rep(seq(1:5),4)
d2=rep(rep(1:2,each=5),2)
m2=rep(1:2,each=10)

L'objectif est de créer un vecteur logique contenant 10 TRUE, 5 FALSE, 5 TRUE (m = 1 ou (m = 2 et d = 2)) Finalement, l'utilisation de ce vecteur logique créera un nouveau h2 en supprimant des éléments 11:15

Résultats des objectifs:

hin2=c(rep("TRUE",10),rep("FALSE",5),rep("TRUE",5))
h2new=c(rep(seq(1:5),2),rep(NA,5),seq(1:5))

hin2
 [1] "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "FALSE"
[12] "FALSE" "FALSE" "FALSE" "FALSE" "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE" 

h2new
 [1]  1  2  3  4  5  1  2  3  4  5 NA NA NA NA NA  1  2  3  4  5
1
johnnyg 30 août 2020 à 06:15

2 réponses

Meilleure réponse

L'utilisation d'opérateurs littéralement logiques donne le booléen hin2. Puis juste replace la négation avec NA.

hin2 <- m2 %in% 1 | (m2 %in% 2 & d2 %in% 2)
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
# [13] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
h2new <- replace(h2, !hin2, NA)
# [1]  1  2  3  4  5  1  2  3  4  5 NA NA NA NA NA  1  2  3  4  5

Pour sélectionner les valeurs, procédez comme suit:

h_new <- h2[!is.na(h2new)]
# [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
1
Gwang-Jin Kim 30 août 2020 à 06:53

Vous pouvez remplacer les valeurs h2 qui satisfont la condition par NA:

h2[!((m2 == 1) | (m2 == 2 & d2 == 2))] <- NA
h2
#[1]  1  2  3  4  5  1  2  3  4  5 NA NA NA NA NA  1  2  3  4  5
0
Ronak Shah 30 août 2020 à 06:53