2011-12-05 16 views
7

Tengo una trama de datos como ésteeliminar columnas con mismo valor de una trama de datos

1 1 1 K 1 K K 
2 1 2 K 1 K K 
3 8 3 K 1 K K 
4 8 2 K 1 K K 
1 1 1 K 1 K K 
2 1 2 K 1 K K 

Quiero eliminar todas las columnas con el mismo valor, es decir, K, por lo que mi resultado será igual esto

1 1 1 1  
2 1 2 1 
3 8 3 1 
4 8 2 1 
1 1 1 1 
2 1 2 1 

Intento iterar en a por columnas pero no obtengo nada. ¿Algunas ideas? gracias de antemano

+0

¿La solución debe tener en cuenta el número así como los caracteres/factores? –

+0

Sí, eso es correcto, – user976991

Respuesta

4

Para seleccionar columnas con más de un valor, independientemente del tipo:

uniquelength <- sapply(d,function(x) length(unique(x))) 
d <- subset(d, select=uniquelength>1) 

?

(Vaya, la pregunta de Romano es correcto - esto podría noquear a su columna 5 también)

Tal vez (edición: gracias a los comentarios!)

isfac <- sapply(d,inherits,"factor") 
d <- subset(d,select=!isfac | uniquelength>1) 

o

d <- d[,!isfac | uniquelength>1] 
+0

Su subconjunto no funciona para mí. Tal vez 'd [,! Isfac | ¡uniquelength! = 1] '? –

+0

¡no funciona para mí! Veo exactamente lo mismo – user976991

+0

... "Recuerdo" ('? Subconjunto') ahora,' subconjunto' funciona en _rows_. Para eludir esto, uno debe especificar 'select' explícitamente, por lo que' subconjunto (d, select =! Isfac | uniquelength> 1) '. @ user976991, intenta eso. –

1

Otra forma de hacerlo es utilizando la función de orden superior Filter. Aquí está el código

to_keep <- function(x) any(is.numeric(x), length(unique(x)) > 1) 
Filter(to_keep, d) 
3

Aquí es una solución que va a trabajar para eliminar ningún columnas duplicadas (incluyendo, por ejemplo, pares de carácter replicada, numérico, o columnas de factores). Así es como leo la pregunta del OP, e incluso si es una lectura incorrecta, parece una pregunta interesante también.

df <- read.table(text=" 
1 1 1 K 1 K K 
2 1 2 K 1 K K 
3 8 3 K 1 K K 
4 8 2 K 1 K K 
1 1 1 K 1 K K 
2 1 2 K 1 K K") 

# Need to run duplicated() in 'both directions', since it considers 
# the first example to be **not** a duplicate. 
repdCols <- as.logical(duplicated(as.list(df), fromLast=FALSE) + 
         duplicated(as.list(df), fromLast=TRUE)) 
# [1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE 

df[!repdCols] 
# V1 V2 V3 V5 
# 1 1 1 1 1 
# 2 2 1 2 1 
# 3 3 8 3 1 
# 4 4 8 2 1 
# 5 1 1 1 1 
# 6 2 1 2 1 
2

Oneliner solution.

df2 <- df[sapply(df, function(x) !is.factor(x) | length(unique(x))>1)] 
Cuestiones relacionadas