J'ai une trame de données comme ça
> df
a b c d
1 1 2 A 1001
2 2 4 B 1002
3 3 6 B 1002
4 4 8 C 1003
5 5 10 D 1004
6 6 12 D 1004
7 7 13 E 1005
8 8 14 E 1006
Je veux supprimer les lignes où il y a des valeurs répétées dans la colonne c ET la colonne d. Ainsi, dans cet exemple, les lignes 2,3,5 et 6 seraient supprimées.
J'ai utilisé cela, qui fonctionne:
df[!(df$c %in% df$c[duplicated(df$c)] & df$d %in% df$d[duplicated(df$d)]),]
>df
a b c d
1 1 2 A 1001
4 4 8 C 1003
7 7 13 E 1005
8 8 14 E 1006
mais cela semble maladroit et je ne peux pas m'empêcher de penser qu'il y a une meilleure façon. Aucune suggestion?
Au cas où quelqu'un voudrait recréer la trame de données, voici le dput:
df = structure(list(a = c(1, 2, 3, 4, 5, 6, 7, 8), b = c(2, 4, 6,
8, 10, 12, 13, 14), c = structure(c(1L, 2L, 2L, 3L, 4L, 4L, 5L,
5L), .Label = c("A", "B", "C", "D", "E"), class = "factor"),
d = c(1001, 1002, 1002, 1003, 1004, 1004, 1005, 1006)), .Names = c("a",
"b", "c", "d"), row.names = c(NA, -8L), class = "data.frame")
Cela fonctionne si vous utilisez duplicated
deux fois:
df[!(duplicated(df[c("c","d")]) | duplicated(df[c("c","d")], fromLast = TRUE)), ]
a b c d
1 1 2 A 1001
4 4 8 C 1003
7 7 13 E 1005
8 8 14 E 1006
Créez un nouvel objet avec les 2 colonnes:
df_dups <- df[c("c", "d")]
Maintenant, appliquez-le à votre df principal:
df[!duplicated(df_dups),]
Semble plus propre et facile à voir/modifier les colonnes que vous utilisez.