Para encontrar si una columna existe en el marco de datos o no

110

Tengo un data.frame con el nombre "abcframe"

     a  b  c
     1  1  1
     2  2  3

¿Cómo puedo saber si una columna existe o no en un marco de datos determinado? Por ejemplo, me gustaría saber si existe una columna d en el data.frame abcframe .

Soleado soleado
fuente
1
¿Quiere saber si su marco de datos tiene una columna con el nombre de d, o desea saber si un vector dado des igual a una de las columnas de su marco de datos?
Quiero saber si el marco de datos tiene una nube con el nombre d o no
Sunny Sunny
¡Te deseo un buen día soleado con 100 votos! :-)
TMS

Respuestas:

196

Suponiendo que el nombre de su marco de datos es daty que el nombre de su columna para verificar es "d", puede usar el %in%operador:

if("d" %in% colnames(dat))
{
  cat("Yep, it's in there!\n");
}

fuente
6
si está buscando lo inverso, es decir, si la columna no está allí, simplemente agregue !al principio:if(!"d"%in% colnames(dat))
toto_tico
Respuesta impresionante. ¿Cómo extiendo esto si estuviera buscando las columnas 'd' y 'e' y 'f'? ¿Sería eso: if("d" & "e" & "f" %in% colnames(dat)) { cat("Yep, it's in there!\n"); }. ¡Gracias! - Oh, es posible que haya encontrado la respuesta yo mismo: stackoverflow.com/questions/21770912/… .
Sander W.van der Laan
6
all (c ("d", "e", "f")% en% colnames (dat))
skan
24

Tiene varias opciones, incluido el uso %in%y grepl:

dat <- data.frame(a=1:2, b=2:3, c=4:5)
dat
  a b c
1 1 2 4
2 2 3 5

Para obtener los nombres de las columnas:

names(dat)
[1] "a" "b" "c"

Úselo %in%para verificar la membresía:

"d" %in% names(dat)
[1] FALSE

Or use `grepl` to check for a match:

grepl("d", names(dat))
[1] FALSE FALSE FALSE
Andrie
fuente
11
Para obtener greplun poco más de precisión, puede usar grepl("^d$",names(dat)), para asegurarse de que una columna con nombre ddno regrese TRUE.
BenBarnes
Gracias por esto, colnamesno funcionó para mí, pero lo nameshizo.
Docconcoct
@Andrie, ¿hay alguna manera de comparar las columnas con dos marcos de datos grandes para ver qué nombres de columna faltan en la otra columna?
sar
8

Podrías usar any:

> names(dat)
[1] "a" "b" "c"
> any(names(dat) == 'b')
[1] TRUE
> any(names(dat) == 'B')
[1] FALSE
Tomasz Pik
fuente
2

También puede usar if(!is.null(abcframe$d))para probar si dexiste en abcframe.

dat <- data.frame(a = 1:2, b = 2:3, c = 4:5)

if (!is.null(dat$d)) {
  print("d exists")
} else {
  print("d does not exist")
}
if (!is.null(dat$a)) {
  print("a exists")
} else {
  print("a does not exist")
}
Jackson
fuente
2
Curiosamente, esto falla con el tidyverse tibble, porque el 'dat $ d' lanzará una advertencia.
miratrix