J'ai une base de données avec> 100 colonnes et je voudrais trouver les lignes uniques en comparant seulement deux des colonnes. J'espère que c'est facile, mais je ne peux pas le faire fonctionner avec unique
ou duplicated
moi-même.
Dans la liste ci-dessous, je voudrais utiliser uniquement id et id2 comme suit:
data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
id id2 somevalue
1 1 x
1 1 y
3 4 z
Je voudrais obtenir soit:
id id2 somevalue
1 1 x
3 4 z
ou:
id id2 somevalue
1 1 y
3 4 z
(Je n'ai pas de préférence laquelle des lignes uniques est conservée)
Ok, peu importe la valeur sélectionnée dans la colonne non dupliquée, cela devrait être assez simple:
dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
id id2 somevalue
1 1 1 x
3 3 4 z
À l'intérieur de l'appel duplicated
, je ne fais que passer les colonnes de dat
dont je ne veux pas de doublons. Ce code sélectionnera toujours automatiquement le premier de toutes les valeurs ambiguës. (Dans ce cas, x.)
Utilisation de unique()
:
dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
dat[row.names(unique(dat[,c("id", "id2")])),]
Voici quelques options dplyr
qui conservent les lignes non dupliquées en fonction des colonnes id et id2:
library(dplyr)
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)
Mise à jour mineure dans le code de @ Joran.
En utilisant le code ci-dessous, vous pouvez éviter l’ambiguïté et obtenir uniquement l’unique de deux colonnes:
dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]