2
votes

Comparaison de chaînes dans 2 lignes adjacentes d'une trame de données dans R

J'ai une base de données avec 627 observations et 16 variables sont présentes. J'envisage une colonne nommée "ZoneDivison" qui a des facteurs: nord-est, est et sud-est. Donc, je veux comparer les valeurs des lignes adjacentes et créer une nouvelle colonne qui a 1, si deux lignes adjacentes ont les mêmes zones, sinon 0, si les lignes adjacentes sont différentes.

J'ai fait référence aux liens suivants pour trouver un moyen en dehors: [ici] Correspondance de deux colonnes dans R [ici] comparer les valeurs de ligne sur plusieurs lignes (R) p>

Expected Result

   ZoneDivision ZoneMatching
 1      Eastern       NA
 2      Eastern       1
 3       Eastern      1               
 4 North Eastern      0
 5 North Eastern      1
 6 North Eastern      1
 7 North Eastern      1
 8 North Eastern      1
 9 North Eastern      1
 10 South Eastern     0
 11 South Eastern     1
 12 South Eastern     1

Actual Result
    ZoneDivision ZoneMatching
1       Eastern           NA
2 North Eastern           NA
3 South Eastern           NA
library(dplyr)
a <- c(rep("Eastern",3),rep ("North Eastern", 6),rep("South Eastern", 3))
a=data.frame(a)
colnames(a)="ZoneDivision"

#comparing the zones
library(plyr)
ddply(n, .(ZoneDivision),summarize,ZoneMatching=Position(isTRUE,ZoneDivision))


Comment dois-je procéder? Veuillez aider !!


0 commentaires

4 Réponses :


1
votes

Vous pouvez utiliser lag pour obtenir cela:

library(dplyr)
a %>%
  mutate(ZoneMatching = as.numeric((ZoneDivision == lag(ZoneDivision, 1))))
    ZoneDivision ZoneMatching
1        Eastern           NA
2        Eastern            1
3        Eastern            1
4  North Eastern            0
5  North Eastern            1
6  North Eastern            1
7  North Eastern            1
8  North Eastern            1
9  North Eastern            1
10 South Eastern            0
11 South Eastern            1
12 South Eastern            1


0 commentaires

2
votes

En utilisant la base R, nous pouvons faire

as.numeric(c(NA, a$ZoneDivision[-1] == a$ZoneDivision[-nrow(a)]))
#[1] NA  1  1  0  1  1  1  1  1  0  1  1


1 commentaires

Merci Ronak, cela a aidé.



2
votes

La méthode data.table:

a <- c(rep("Eastern",3),rep ("North Eastern", 6),rep("South Eastern", 3))
dt <- as.data.table(a)

dt[,'ZoneMatching' := as.numeric(.SD[,a] == shift(.SD[,a],1))]

Où vous ajoutez une nouvelle colonne ZoneMatching comme valeurs numériques de la comparaison logique entre le a strong> et les valeurs décalées, générées par la fonction shift () .


0 commentaires

1
votes

Nous pouvons utiliser base R

with(a, c(NA, +(head(ZoneDivision, -1) == tail(ZoneDivision, -1))))
#[1] NA  1  1  0  1  1  1  1  1  0  1  1


0 commentaires