J'ai essayé d'obtenir une colonne de moyennes pondérées qui exclut certaines lignes pour chaque ligne à l'aide de données.
Dans l'exemple suivant, FIPS est une variable d'identification et l'état est une variable de groupe. Je tiens à calculer la moyenne pondérée de la valeur exclusive des comtés voisins dans un même État. ainsi que dans d'autres États. P>
Je sais comment la mettre en œuvre mais je suppose qu'il y a une voie plus efficace. Je ne connais pas la manipulation d'aspiration à l'aide de données. Des idées? Merci en avance. p>
3 Réponses :
Peut-être y a-t-il équivalent où DATA STRY> P> data.table code>, voici une solution dans
Tidyverse code>
op_val1 code > et
op_val2 code> est la sortie après avoir exécuté le
pour code> en boucle dans op. p>
set.seed(920410)
DT <- data.table(FIPS =1:21, STATE = LETTERS[1:2], value=1:3, weight=2:7)
DT[, nbs := list(list(sample(1:21, 3))), by= names(DT)]
for(i in 1:nrow(DT)){
DT$OP_val1[i] <- sum(DT[FIPS %in% unlist(DT$nbs[i]) & STATE == DT$STATE[i], value*weight])
DT$OP_val2[i] <- sum(DT[FIPS %in% unlist(DT$nbs[i]) & STATE != DT$STATE[i], value*weight])
}
Voici une option dans sortie: p> data.table code> en la convertissant en un format long avant d'effectuer des jointures:
FIPS STATE value weight neighbor_sum_in_the_same_state neighbor_sum_in_other_states
1: 1 A 1 2 14 21
2: 2 B 2 3 11 12
3: 3 A 3 4 0 17
4: 4 B 1 5 5 14
5: 5 A 2 6 16 0
6: 6 B 3 7 26 12
7: 7 A 1 2 14 5
8: 8 B 2 3 27 2
9: 9 A 3 4 2 42
10: 10 B 1 5 6 14
11: 11 A 2 6 12 26
12: 12 B 3 7 11 2
13: 13 A 1 2 12 11
14: 14 B 2 3 5 24
15: 15 A 3 4 12 26
16: 16 B 1 5 21 24
17: 17 A 2 6 4 5
18: 18 B 3 7 6 14
19: 19 A 1 2 14 5
20: 20 B 2 3 11 12
21: 21 A 3 4 12 27
FIPS STATE value weight neighbor_sum_in_the_same_state neighbor_sum_in_other_states
Merci à vous deux :) Ceux qui aident!
Après avoir essayé diverses méthodes, j'ai écrit le code suivant. Le code suivant calcule la moyenne pondérée des valeurs excluant les comtés voisins dans le même État que dans d'autres États sans utiliser de boucle. p>