class - español - ¿Por qué ifelse convierte un data.frame a una lista: ifelse(TRUE, data.frame(1), 0))!!=Data.frame(1)?
filtrar data frame r (1)
ifelse
generalmente está destinado a comparaciones vectorizadas, y tiene efectos secundarios como estos: como se dice en ?ifelse
,
‘ifelse’ returns a value with the same shape as ‘test’ ...
entonces en este caso (la test
es un vector de longitud 1) intenta convertir el marco de datos a un ''vector'' (lista en este caso) de longitud 1 ...
return(if (condition) mydf else NA)
Como punto de diseño general, intento devolver objetos de la misma estructura pase lo que pase, por lo que podría preferir
if (!condition) mydf[] <- NA
return(mydf)
Como regla general, encuentro que los usuarios R (especialmente provenientes de otros lenguajes de programación) comienzan usando de manera exclusiva, toman un tiempo para descubrir ifelse
, luego los sobreutilizan por un tiempo, descubriendo más tarde que realmente quieren usar if
en contextos lógicos . Algo similar sucede con &
y &&
.
Ver también:
- la sección 3.2 del R Inferno de Patrick Burns ...
- ¿Por qué las declaraciones ifelse de R no pueden devolver vectores?
Quiero devolver un data.frame desde una función si es TRUE, de lo contrario devolveré NA usando return(ifelse(condition, mydf, NA))
Sin embargo, ifelse quita los nombres de columna de data.frame.
¿Por qué estos resultados son diferentes?
> data.frame(1)
X1
1 1
> ifelse(TRUE, data.frame(1), NA)
[[1]]
[1] 1
Algunas ideas adicionales de dput ():
> dput(ifelse(TRUE, data.frame(1), 0))
list(1)
> dput(data.frame(1))
structure(list(X1 = 1), .Names = "X1", row.names = c(NA, -1L),
class = "data.frame")