2013-08-28 7 views
2

J'ai un data.table et que vous voulez choisir les lignes du data.table où certaines valeurs d'une variable x sont uniques par rapport à une autre variable yobtenir des lignes de valeurs uniques par groupe

Il est possible d'obtenir la des valeurs uniques de x, regroupées par y dans un autre jeu de données, comme celui-ci

dt[,unique(x),by=y] 

Mais je veux choisir les lignes dans l'ensemble de données d'origine lorsque cela est le cas. Je ne veux pas de nouvelle table de données car j'ai aussi besoin des autres variables.

Alors, que dois-je ajouter à mon code pour obtenir les lignes dt pour lesquelles ce qui précède est vrai?

dt <- data.table(y=rep(letters[1:2],each=3),x=c(1,2,2,3,2,1),z=1:6) 

    y x z 
1: a 1 1 
2: a 2 2 
3: a 2 3 
4: b 3 4 
5: b 2 5 
6: b 1 6 

Ce que je veux:

y x z 
1: a 1 1 
2: a 2 2 
3: b 3 4 
4: b 2 5 
5: b 1 6 

Répondre

5

data.table est un peu différent dans la façon d'utiliser duplicated. Voici l'approche que je l'ai vu ici quelque part:

dt <- data.table(y=rep(letters[1:2],each=3),x=c(1,2,2,3,2,1),z=1:6) 
setkey(dt, "y", "x") 
key(dt) 
# [1] "y" "x" 
!duplicated(dt) 
# [1] TRUE TRUE FALSE TRUE TRUE TRUE 
dt[!duplicated(dt)] 
# y x z 
# 1: a 1 1 
# 2: a 2 2 
# 3: b 1 6 
# 4: b 2 5 
# 5: b 3 4 
+1

+1 Btw, Steve a ajouté 'by' à' duplicated' et 'unique' pour' data.table'. Dans la prochaine version, vous pouvez spécifier les colonnes à tester: 'unique (dt, by = c (" y "," x "))". Dans v1.8.9 sur R-Forge. Par défaut 'by' est' key (dt) 'donc ça marche comme si auparavant' by' n'était pas fourni. –

+0

Mais 'identique (unique (dt), dt [! Dupliqué (dt)])' est vrai après avoir défini la clé, alors pourquoi ne pas utiliser 'unique'? – Frank

0

Merci à dplyR

library(dplyr) 
col1 = c(1,1,3,3,5,6,7,8,9) 
col2 = c("cust1", 'cust1', 'cust3', 'cust4', 'cust5', 'cust5', 'cust5',  'cust5', 'cust6') 
df1 = data.frame(col1, col2) 
df1 

distinct(select(df1, col1, col2)) 
2

La solution data.table plus simple est de saisir le premier élément de chaque groupe

> dt[, head(.SD, 1), by=.(y, x)] 
    y x z 
1: a 1 1 
2: a 2 2 
3: b 3 4 
4: b 2 5 
5: b 1 6 
4

Le idiomatique data.table façon:

require(data.table) 
unique(dt, by = c("y", "x")) 
# y x z 
# 1: a 1 1 
# 2: a 2 2 
# 3: b 3 4 
# 4: b 2 5 
# 5: b 1 6 
Questions connexes