Hola a todos,

     En principio cualquier operación que incluya NA's devuelve un NA, 
pero en este caso R trata de evaluar la expresión lógica y si alguno de 
los lógicos de los "O" es cierto devuelve TRUE:
 > TRUE | NA
[1] TRUE
 > NA | TRUE
[1] TRUE
 > NA | FALSE
[1] NA
 > NA | NA
[1] NA

     Por tanto parece que solo devuelve NA's en el caso de que todas la 
condiciones no falsas sean NA's.

     En cuanto a andar cambiando los valores de la base de datos sólo 
para hacer esto no lo recomendaría. En esta caso concreto recomendaría 
cambiar los NA's del resultado final por 0's (supongo que se quiere 
esto), e.g.:
guaran$datif[is.na(guaran$datif)] <- 0

     Si solo se quiere hacer una operación para los que verifiquen una 
condición, yo sería partidario de emplear índices, e.g.
cond <-  complete.cases(guaran)
guaran$datmatriz <- 0
guaran$datmatriz[cond] <- with(guaran[cond,], 
ifelse(sp=="L.lucidum"|pap11 == 
"muerto"|pap06=="muerto"|pap01=="muerto"|pap96=="muerto", 1, 0))
Aunque no para este caso...

     Un saludo,
         Rubén Fdez


El 26/02/2014 23:18, Carlos Ortega escribió:
> Hola,
>
> He probado la alternativa de los paréntesis... pero el problema sigue
> produciéndose a partir de la fila 45 como al principio...:
>
>> guaran$datif <- ifelse(
> +                    ((guaran$sp == "L.lucidum") | (guaran$pap11 ==
> "muerto")
> +                  | (guaran$pap06 == "muerto") | (guaran$pap01 == "muerto")
> +                  | (guaran$pap96 == "muerto")), 1, 0
> +                           )
>> head(guaran,50)
> ...
>
> 42   c.1        T.stans  <NA>  nuevo     35 muerto   <NA> 153 52     1
> 43   c.1    P.porphyria  <NA>  nuevo     65     63     66 149 52     *0*
> 44   c.1        T.stans  <NA>  nuevo     47 muerto   <NA> 149 52     *1*
> 45   c.1       C.lilloi  <NA>   <NA>  nuevo     54     53 159 42    *NA*
> 46   c.1    P.porphyria  <NA>   <NA>  nuevo     34     38 157 44    *NA*
> 47   c.1      R.apetala  <NA>   <NA>  nuevo     32     34 157 49    NA
> 48   c.1       A.edulis  <NA>   <NA>  nuevo     32     33 140 54    NA
> 49   c.1       A.edulis  <NA>   <NA>   <NA>  nuevo     32 154 53    NA
> 50   c.1     C.vernalis  <NA>   <NA>   <NA>  nuevo     36 156 54    NA
>
> Y el patrón de que aparezcan dos NAs contiguos tampoco es la razón, ya que
> hay casos anteriores que son procesados correctamente..(filas 4, 5 y 6 por
> ejemplo)...:
>
> 4    c.1        T.stans    35     36 muerto   <NA>   <NA> 158 57     *1*
> 5    c.1        T.stans    34     35 muerto   <NA>   <NA> 158 60     *1*
> 6    c.1        T.stans    40 muerto   <NA>   <NA>   <NA> 147 57     *1*
>
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
>
>
>
> El 26 de febrero de 2014, 22:43, Jorge Miguel Garcia Fernandez <
> jm.garcia.fdz@gmail.com> escribió:
>
>> El problema puede estar en el no uso de suficientes paréntesis. Por
>> ejemplo, con:
>>> a=1
>>> b=0
>>> c=0
>> la instrucción
>>
>>   ifelse(((a>1) | (b=0) | (c=1) | (d=1)), 11, 22)
>>
>> da el resultado esperado:
>>
>> [1] 11
>>
>> Pero si se omiten los paréntesis se llega a un error de interpretación:
>>
>> destino de la asignación se expande a un objeto fuera del lenguaje
>>
>> Espero que sirva
>>
>> Jorge
>>
>>
>>
>> El 26/2/14, daniel <daniel319@gmail.com> escribió:
>>> Priscila,
>>>
>>> Los NA aparecen porque en la condición:
>>>
>>> guaran$sp=="L.lucidum"|guaran$pap11 ==
>>>
>> "muerto"|guaran$pap06=="muerto"|guaran$pap01=="muerto"|guaran$pap96=="muerto"
>>> hay alguna columna que es NA. Por ejemplo en la línea 46:
>>>
>>>   c.1    P.porphyria  <NA>   <NA>  nuevo     34     38 157 44        NA
>>>
>>> la cuarta columan es pap96. Si los NA están en columnas que no son
>>> evaluadas por la condición, no se debieran generan NA. No revisé caso por
>>> caso para ver si esto se cumple pero hace sentido para mi.
>>>
>>> Para resolver el problema lo mejor es que sigas lo propuesto por
>> Francisco
>>> Viciana.
>>>
>>> Si lo que quieres es ignorar las columnas con NA y seguir buscando en las
>>> otras entonces reemplaza los NA por otra variable en las columnas que
>> usas
>>> y terminado vuelve a poner en su lugar los NA. Ten mucho cuidado si haces
>>> esto, y solo si lo permite el problema que tratas de resolver.
>>>
>>> Espero te sirva para entender por que aparecen los NA en tu ejemplo.
>>>
>>> Daniel Merino
>>>
>>>
>>>
>>> El 26 de febrero de 2014, 13:41, "Marcuzzi, Javier Rubén" <
>>> javier.ruben.marcuzzi@gmail.com> escribió:
>>>
>>>> Hola
>>>>
>>>> No es lo mismo pero en mi caso personal la forma que utilizo se basa en
>>>> el ejemplo de http://cran.r-project.org/doc/contrib/grafi3.pdf página
>>>> 49, no usa el if pero también hay una condición para todos los
>>>> verdaderos.
>>>>
>>>> No intenté en este caso en particular, habría que ver si también da
>>>> problemas, pero como Carlos Ortega que sabe mucho dio una solución y
>>>> como vos estas empezando no quiero confundirte,
>>>>
>>>> Javier Marcuzzi
>>>>
>>>>
>>>> El 26/02/14 12:49, Carlos Ortega escribió:
>>>>> Hola,
>>>>>
>>>>> No he encontrado la razón de que la explicación sea estrictamente la
>>>>> presencia de NAs.
>>>>> Por este contraejemplo:
>>>>>
>>>>>> val <- guaran[44,]
>>>>>> val
>>>>>      parc.      sp pap91 pap96 pap01  pap06 pap11   x  y
>>>>> 44   c.1 T.stans  *<NA>* nuevo    47 muerto  *<NA>* 149 52
>>>>>> ifelse(
>>>>> +                    val$sp=="L.lucidum" | val$pap11 == "muerto"
>>>>> +                  | val$pap06=="muerto" | val$pap01=="muerto"
>>>>> +                  | val$pap96=="muerto", 1, 0
>>>>> +                           )
>>>>> [1] *1* *#Devuelve bien el valor el ifelse a pesar de que hay NAs.*
>>>>>> val <- guaran[45,]
>>>>>> val
>>>>>      parc.       sp pap91 pap96 pap01 pap06 pap11   x  y
>>>>> 45   c.1 C.lilloi  *<NA>*  *<NA> *nuevo    54    53 159 42
>>>>>> ifelse(
>>>>> +                    val$sp=="L.lucidum" | val$pap11 == "muerto"
>>>>> +                  | val$pap06=="muerto" | val$pap01=="muerto"
>>>>> +                  | val$pap96=="muerto", 1, 0
>>>>> +                           )
>>>>> [1] *NA* *# Pero en este otro caso que debería ser "1" devuelve un
>>>>> "NA".*
>>>>>
>>>>> Al aplicar el "ifelse" es a partir de la fila 45 donde comienzan a
>>>> aparecer
>>>>> los "NA", aunque en múltiples filas anteriores hay valores NA.
>>>>>
>>>>> Pero sí que es cierto que al quitar todos los NAs el problema se
>>>> resuelve.
>>>>> El siguiente código quita los NA, aplica el ifelse creando la nueva
>>>> columna
>>>>> y vuelve a darte a ponerte los NAs que tenías al principio....
>>>>>
>>>>>
>> #-------------------------------------------------------------------------
>>>>> # Sustituyo los NA por ZZ
>>>>> guaran <- dat.in[,c(1:9)]
>>>>> for (i in 1:dim(guaran)[2]) {
>>>>>       guaran[is.na(guaran[,i]),i] <- c("ZZ")
>>>>> }
>>>>> #head(guaran,25)
>>>>>
>>>>> #Compruebo que funciona el ifelse
>>>>> guaran$datmatriz <- ifelse(
>>>>>                      guaran$sp == "L.lucidum" | guaran$pap11 ==
>> "muerto"
>>>>>                    | guaran$pap06 == "muerto" | guaran$pap01 ==
>> "muerto"
>>>>>                    | guaran$pap96 == "muerto", 1, 0
>>>>>                             )
>>>>> #head(guaran,50)
>>>>>
>>>>> #Devuelvo el data.frame al estado original
>>>>> # Pero con la columna del ifelse ya añadida y evaluada
>>>>> for (i in 1:dim(guaran)[2]) {
>>>>>       guaran[guaran[,i]=="ZZ",i] <- NA
>>>>> }
>>>>>
>>>>> #head(guaran,50)
>>>>>
>> #-------------------------------------------------------------------------
>>>>>
>>>>> Saludos,
>>>>> Carlos Ortega
>>>>> www.qualityexcellence.es
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> El 26 de febrero de 2014, 15:23, Priscila Ana Powell <
>>>>> priscilaapowell@gmail.com> escribió:
>>>>>
>>>>>> Hola gente!! Estoy empezando a trabajar con R, y no puedo resolver lo
>>>>>> siguiente:
>>>>>>
>>>>>> Quiero crear una nueva variable (datmatriz) que toma el valor de 1
>> si:
>>>>>> -la variable sp es igual a L.lucidum
>>>>>> -alguna de las variables pap11, pap06, pap01, pap96 es igual a
>> muerto.
>>>>>> El script que utilicé es :
>>>>>>
>>>>>> guaran$datmatriz<-ifelse (guaran$sp=="L.lucidum"|guaran$pap11 ==
>>>>>>
>> "muerto"|guaran$pap06=="muerto"|guaran$pap01=="muerto"|guaran$pap96=="muerto",
>>>>>> 1, 0)
>>>>>>
>>>>>> Sin embargo, al observar datmatriz, tengo 0, 1 y NA, que no sé que
>> los
>>>>>> genera.
>>>>>>
>>>>>> Alguna idea para salvar el inconveniente?
>>>>>>
>>>>>> adjunto la matriz
>>>>>>
>>>>>> desde ya, muchas gracias!!
>>>>>>
>>>>>>
>>>>>> saludos !
>>>>>>
>>>>>> Priscila
>>>>>> --
>>>>>>    Priscila Ana Powell
>>>>>> Instituto de Ecología Regional
>>>>>> Facultad de Ciencias Naturales e Instituto Miguel Lillo
>>>>>> Universidad Nacional de Tucumán
>>>>>> Argentina
>>>>>>
>>>>>> _______________________________________________
>>>>>> R-help-es mailing list
>>>>>> R-help-es@r-project.org
>>>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> R-help-es mailing list
>>>>> R-help-es@r-project.org
>>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>>>
>>>>          [[alternative HTML version deleted]]
>>>>
>>>>
>>>> _______________________________________________
>>>> R-help-es mailing list
>>>> R-help-es@r-project.org
>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>>>
>>>>
>>>
>>> --
>>> Daniel
>>>
>>>        [[alternative HTML version deleted]]
>>>
>>>
>> _______________________________________________
>> R-help-es mailing list
>> R-help-es@r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>
>
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es


	[[alternative HTML version deleted]]

