seleccionar - instalar paquete dplyr en r
Filtrar mĂșltiples valores en una columna de cadena en dplyr (3)
Esto se puede lograr utilizando el paquete dplyr, que está disponible en CRAN. La forma simple de lograr esto:
-
Instalar el paquete
dplyr
. -
library(dplyr) df<- select(filter(dat,name==''tom''| name==''Lynn'',c(''days'',''name))
Explicación:
Entonces, una vez que hemos descargado dplyr, creamos un nuevo marco de datos usando dos funciones diferentes de este paquete:
filtro: el primer argumento es el marco de datos; El segundo argumento es la condición por la cual queremos subconjunto. El resultado es el marco de datos completo con solo las filas que queríamos. select: el primer argumento es el marco de datos; El segundo argumento son los nombres de las columnas que queremos seleccionar. No tenemos que usar la función de nombres (), y ni siquiera tenemos que usar comillas. Simplemente enumeramos los nombres de las columnas como objetos.
Tengo un
data.frame
con datos de caracteres en una de las columnas.
Me gustaría filtrar varias opciones en
data.frame
desde la misma columna.
¿Hay una manera fácil de hacer esto que me estoy perdiendo?
Ejemplo:
data.frame
name =
dat
days name
88 Lynn
11 Tom
2 Chris
5 Lisa
22 Kyla
1 Tom
222 Lynn
2 Lynn
Me gustaría filtrar a
Tom
y
Lynn
por ejemplo.
Cuando lo hago:
target <- c("Tom", "Lynn")
filt <- filter(dat, name == target)
Me sale este error:
longer object length is not a multiple of shorter object length
Necesita
%in%
lugar de
==
:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
Produce
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
Para entender por qué, considere lo que sucede aquí:
dat$name == target
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
Básicamente, estamos reciclando el vector
target
dos longitudes cuatro veces para que coincida con la longitud de
dat$name
.
En otras palabras, estamos haciendo:
Lynn == Tom
Tom == Lynn
Chris == Tom
Lisa == Lynn
... continue repeating Tom and Lynn until end of data frame
En este caso no recibimos un error porque sospecho que su marco de datos en realidad tiene un número diferente de filas que no permiten el reciclaje, pero la muestra que proporciona sí (8 filas).
Si la muestra hubiera tenido un número impar de filas, habría obtenido el mismo error que usted.
Pero incluso cuando el reciclaje funciona, esto claramente no es lo que quieres.
Básicamente, la declaración
dat$name == target
es equivalente a decir:
devuelve
TRUE
por cada valor impar que sea igual a "Tom" o por cada valor par que sea igual a "Lynn".
Sucede que el último valor en su marco de datos de muestra es par e igual a "Lynn", de ahí el
TRUE
anterior.
En contraste,
dat$name %in% target
dice:
para cada valor en
dat$name
, verifique que exista entarget
.
Muy diferente. Aquí está el resultado:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
Tenga en cuenta que su problema no tiene nada que ver con
dplyr
, solo el mal uso de
==
.
Usando el paquete
base
:
df <- data.frame(days = c(88, 11, 2, 5, 22, 1, 222, 2), name = c("Lynn", "Tom", "Chris", "Lisa", "Kyla", "Tom", "Lynn", "Lynn"))
# Three lines
target <- c("Tom", "Lynn")
index <- df$name %in% target
df[index, ]
# One line
df[df$name %in% c("Tom", "Lynn"), ]
Salida:
days name
1 88 Lynn
2 11 Tom
6 1 Tom
7 222 Lynn
8 2 Lynn
Usando
sqldf
:
library(sqldf)
# Two alternatives:
sqldf(''SELECT *
FROM df
WHERE name = "Tom" OR name = "Lynn"'')
sqldf(''SELECT *
FROM df
WHERE name IN ("Tom", "Lynn")'')