1
votes

Filtrer les données dans R avec le même ID et déterminer les lignes qui sont dans les deux blocs de données et quelles lignes ne sont pas dans les deux blocs de données

Est-ce que quelqu'un connaît une autre méthode de filtrage des données lorsqu'il y a deux fois le même ID (colonne X) dans un bloc de données mais avec une valeur associée différente (colonnes Y)?

En gros, je veux savoir quelles lignes se trouvent dans les deux bloc de données et après je veux savoir quelle ligne n'est pas dans les deux blocs de données (en fait, je veux la valeur de X et Y de cette ligne particulière)

Merci d'avance pour votre aide!

   > x <- seq(1:10)
    > x[5] <- 4
    > y <- (seq.int(1,19,2))
    > 
    > x<- cbind(x,y)
    > x
           x  y
     [1,]  1  1
     [2,]  2  3
     [3,]  3  5
     [4,]  4  7
     [5,]  4  9
     [6,]  6 11
     [7,]  7 13
     [8,]  8 15
     [9,]  9 17
    [10,] 10 19
    > 
    > z <- x[1:4,]
    > y <- x[6:10,]
    > 
    > z <- rbind(z,y)
    > z
           x  y
     [1,]  1  1
     [2,]  2  3
     [3,]  3  5
     [4,]  4  7
     [5,]  6 11
     [6,]  7 13
     [7,]  8 15
     [8,]  9 17
     [9,] 10 19
    > 
    > df1 <- z[z[,1] %in% x[,1]] 
    > 
    > matrix(df1,9,2) # As expected I'm getting 9 rows
          [,1] [,2]
     [1,]    1    1
     [2,]    2    3
     [3,]    3    5
     [4,]    4    7
     [5,]    6   11
     [6,]    7   13
     [7,]    8   15
     [8,]    9   17
     [9,]   10   19
    > 
    > # Now I want to know what is the value inside the missing row
    > df2 <- z[!z[,1] %in% x[,1]] 
    > 
    > matrix(df2,1,2) # I'm getting NA and NA, bu I was expecting the values 4 and 9
         [,1] [,2]
    [1,]   NA   NA


5 commentaires

Vous avez dupliqué la ligne dans z et tous les éléments contiennent dans x, quelle est votre sortie attendue


Ma sortie attendue lorsque je fais z [! Z [ 1]% dans% x [ 1]] est la ligne # 5 dans x (4 et 9)


Oui, je remarque cela et je fournis une réponse.


Votre question pose deux choses assez différentes: 1) filtrer les données lorsqu'il y a deux fois le même ID, et 2) les lignes sont dans les deux blocs de données et après je veux savoir quelle ligne n'est pas dans les deux blocs de données.


@AidanGawronski Merci, j'ai mis à jour le titre


5 Réponses :


0
votes

Ce que vous faites ici est de filtrer les valeurs qui ne sont pas présentes dans x [ 1] . Cependant, puisque 4 est là-dedans, il est également filtré.

Au lieu de cela, je suppose que vous voudrez probablement travailler avec la méthode setdiff de dplyr ( voir le doc ici )

Ensuite, utilisez df2 <- setdiff (x, z)


0 commentaires

0
votes

J'utilise le cumcount ici pour ajouter une autre clé pour distinguer la valeur en double dans x[1

v=ave(x[,1]==x[,1], x[,1], FUN=cumsum)
t=ave(z[,1]==z[,1], z[,1], FUN=cumsum)
df2 <- x[!paste(x[,1],v) %in% paste(z[,1],t)]
matrix(df2,1,2)
     [,1] [,2]
[1,]    4    9


0 commentaires

0
votes
x <- data.frame(x)
z <- data.frame(z)
x$from <- "x"
z$from <- "z"

df2 <- merge(x, z, by = c("x", "y"), all.x = T)
df2
# x  y from.x from.y
# 1   1  1      x      z
# 2   2  3      x      z
# 3   3  5      x      z
# 4   4  7      x      z
# 5   4  9      x   <NA>
# 6   6 11      x      z
# 7   7 13      x      z
# 8   8 15      x      z
# 9   9 17      x      z
# 10 10 19      x      z

df2 <- df2[is.na(df2$from.y),]
df2
# x y from.x from.y
# 5 4 9      x   <NA>

0 commentaires

0
votes

Pour utiliser la méthode @hansjaneinvielleicht:

xlist <- paste(x[,1], x[,2])
zlist <- paste(z[,1], z[,2])

setdiff(xlist, zlist)
# [1] "4 9"


0 commentaires

0
votes

Étant donné que mon vrai problème n'était pas celui qui était affiché car il était trop compliqué.

En gros, je n'ai pas pu appliquer de solution à mon vrai problème car mes véritables blocs de données contenaient tous les types colonnes.

Mais j'ai pu trouver une solution que de travailler pour mon vrai problème mais aussi pour le problème posté dans la question, donc je poste la réponse que résolu mon vrai problème au cas où cela pourrait être utile pour quelqu'un!

> dup <- which(duplicated(x[,1]) == TRUE)
> ans <- matrix(x[dup,],1,2)
> ans
     [,1] [,2]
[1,]    4    9

> # I'm doing this in case the answer was not NA in df2 at the previous step, without
  # providing the row "missing"
> df2 <- rbind(df2, ans)
> df2
     [,1] [,2]
[1,]    4    9


0 commentaires