2011-10-17 5 views
30

tengo la siguiente trama de datos en I:único() para más de una variable

> str(df) 
'data.frame': 545227 obs. of 15 variables: 
$ ykod : int 93 93 93 93 93 93 93 93 93 93 ... 
$ yad : Factor w/ 42 levels "BAKUGAN","BARBIE",..: 30 30 30 30 30 30 30 30 30 30 ... 
$ per : Factor w/ 3 levels "2 AYLIK","3 AYLIK",..: 3 3 3 3 3 3 3 3 3 3 ... 
$ donem: int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... 
$ sayi : int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... 
$ mkod : int 4 5 9 11 12 18 20 22 25 26 ... 
$ mad : Factor w/ 10464 levels " Defne Market   ",..: 405 8075 9710 10145 9297 7973 2542 3892 2759 5769 ... 
$ mtip : Factor w/ 29 levels "Abone Bürosu          ",..: 2 20 20 2 2 2 2 2 2 2 ... 
$ kanal: Factor w/ 2 levels "OB","SS": 2 2 2 2 2 2 2 2 2 2 ... 
$ bkod : int 110565 110565 110565 110565 110565 110565 110565 110565 110565 110565 ... 
$ bad : Factor w/ 212 levels "4. Levent","500 Evler",..: 167 167 167 167 167 167 167 167 167 167 ... 
$ bolge: Factor w/ 12 levels "Adana Şehiriçi",..: 7 7 7 7 7 7 7 7 7 7 ... 
$ sevk : int 2 3 3 3 2 2 2 6 2 2 ... 
$ iade : int 2 1 0 2 0 2 1 0 0 2 ... 
$ satis: int 0 2 3 1 2 0 1 6 2 0 ... 

Quiero lista única (como la de SQL distintas) los valores de las variables múltiples seleccionados. Por ejemplo, unique(yad) me da los nombres de cada uno de 42 elementos, pero tengo que extraer dos columnas (yad y per juntos, con todas las combinaciones únicas):

yad   per 
---   --- 
BARBIE  AYLIK 
BAKUGAN  2 AYLIK 
MICKEY MOUSE 2 AYLIK 
TINKERBELL 3 AYLIK 
...   ... 

¿Cómo puedo lograr esto?

Respuesta

75

¿Qué le parece usar unique()?

df <- data.frame(yad = c("BARBIE", "BARBIE", "BAKUGAN", "BAKUGAN"), 
       per = c("AYLIK", "AYLIK", "2 AYLIK", "2 AYLIK"), 
       hmm = 1:4) 

df 
#  yad  per hmm 
# 1 BARBIE AYLIK 1 
# 2 BARBIE AYLIK 2 
# 3 BAKUGAN 2 AYLIK 3 
# 4 BAKUGAN 2 AYLIK 4 

unique(df[c("yad", "per")]) 
#  yad  per 
# 1 BARBIE AYLIK 
# 3 BAKUGAN 2 AYLIK 
+1

+ 1 También recomendaría normalizar cadenas (tolower, gsub out caracteres especiales, etc.). –

+0

¿Cómo hacerlo si 'df' es una matriz? ¿Debo transformarlo a 'data.frame', o hay una función para hacerlo? – sop

+2

En realidad he encontrado 'unique.matrix()' que ha hecho el trabajo, gracias de todos modos – sop

5

Hay algunas maneras de obtener todas las combinaciones únicas de un conjunto de factores.

with(df, interaction(yad, per, drop=TRUE)) # gives labels 
with(df, yad:per)       # ditto 

aggregate(numeric(nrow(df)), df[c("yad", "per")], length) # gives a data frame 
7

Esto es una adición a la respuesta de Josh.

También puede mantener los valores de otras variables, mientras que el filtrado de filas duplicadas en data.table

Ejemplo:

library(data.table) 

#create data table 
dt <- data.table(
    V1=LETTERS[c(1,1,1,1,2,3,3,5,7,1)], 
    V2=LETTERS[c(2,3,4,2,1,4,4,6,7,2)], 
    V3=c(1), 
    V4=c(2)) 

> dt 
# V1 V2 V3 V4 
# A B 1 2 
# A C 1 2 
# A D 1 2 
# A B 1 2 
# B A 1 2 
# C D 1 2 
# C D 1 2 
# E F 1 2 
# G G 1 2 
# A B 1 2 

# set the key to all columns 
setkey(dt) 

# Get Unique lines in the data table 
unique(dt[list(V1, V2), nomatch = 0]) 

# V1 V2 V3 V4 
# A B 1 2 
# A C 1 2 
# A D 1 2 
# B A 1 2 
# C D 1 2 
# E F 1 2 
# G G 1 2 

Alerta: Si hay diferentes combinaciones de valores de las otras variables, a continuación, el resultado será la combinación

única de V1 y V2

+0

extraño, la operación única funciona pero el resultado dt tiene todas las demás columnas establecidas en NA. ¿Sabes por qué? –

+0

Gracias por detectar eso. Esta operación realiza una fusión y, por lo tanto, puede generar algunos valores 'NA'. La solución sería reemplazar 'allow.cartesian = TRUE' con' nomatch = 0', lo que ignoraría los valores de 'NA' en los resultados. He actualizado la respuesta. Gracias –

-1
df$new_var = paste(df$yad,df$per,sep = "_") 
length(unique(df$new_var)) #for checking 
df = df[!duplicated(df$new_var),] 
nrow(df) # for checking , this should be equal to 2nd line output 
df$new_var = NULL 
+0

Esto no solo le da valores distintos: sobrescribe el data.frame original. No es lo que OP está pidiendo. – BenBarnes

+0

Si no quiere sobrescribirlo, entonces es simple amigo. Simplemente ponga df2 en lugar de df en la 3ra línea 1.a.DONE – ashok

Cuestiones relacionadas