2017-09-04 1 views
0
AreaCode Name Rank 
1001108 HA - 2326 
1001247 HA - 2327 
1003063 GC - 2328 
1000957 DG - 2329 
1001290 EA - 2330 
1003305 GC - 2331 
1003417 GC - 2332 
1006442 WL - 2333 
1005076 PK - 2334 
1004581 NL - 2335 

Je suis nouveau à R et j'ai quelques problèmes. J'ai un ensemble de données où je veux sous-classer les AreaCodes les plus proches les plus proches/les plus proches de GC afin de faire une étude cas-témoins.Conditions du sous-ensemble observation supérieure/inférieure la plus proche

Donc, je veux AreaCode 1001247, 1000957, 1001290, 1006442 dans un cadre de données séparé. Comment puis-je faire cela? Je suppose en boucle, mais n'ai aucune expérience avec ceux-ci. Ces données ont ~ 6000 observations donc le faire à la main devient épuisant. Est-ce qu'il y a un moyen de faire ça?

+0

Pouvez-vous préciser ce que vous voulez dire par le plus proche? Nrs les plus proches dans Ranks/AreaCode, location? – timfaber

+0

Salut, oui - Je veux le rang le plus proche, donc pour chaque indicatif régional du GC, je veux le code régional non GC le plus proche (plus haut et plus bas). – Erika

+0

S'il vous plaît partager votre sortie désirée. – www

Répondre

0

Une alternative serait quelque chose comme ceci (en supposant nom est une variable de caractères):

df2 = df %>% 
    mutate(newcol = ifelse(!Name=="GC"&(lag(Name)=="GC"|lead(Name)=="GC"),1,0)) %>% 
    filter(newcol==1) 
+0

Cela a fonctionné, merci! – Erika

0

cumsum et rle sont utiles ici

brks <- cumsum(rle(df$Name)$lengths) 
# [1] 2 3 4 5 7 8 9 10 

equalsGC <- which(rle(df$Name)$values=="GC") 
# [1] 2 5 

ans <- df$AreaCode[sort(brks[c(equalsGC+1, equalsGC-1)])] 
# [1] 1001247 1003063 1001290 1003417 

Comme un seul bloc

brks <- cumsum(rle(df$Name)$lengths) 
equalsGC <- which(rle(df$Name)$values=="GC") 
ans <- df$AreaCode[sort(brks[c(equalsGC+1, equalsGC-1)])]