[R-br] Erro em subset

Fernando Mayer fernandomayer em gmail.com
Quinta Abril 12 17:08:56 BRT 2012


O problema não é na seleção, e sim na precisão numérica. Dificilmente
vc conseguirá comparar um número armazenado como double com outro
número que não seja _exatamente_ igual a ele. Lembre-se que o 0.001
que vc vê está armazenado  internamente com uma precisão muito maior.
Vc pode verificar isso com:

> .Machine$double.eps
[1] 2.220446e-16

> typeof(xyz$y)
[1] "double"

E veja também a FAQ
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f

Uma solução para contornar esse problema seria testar se um valor é
igual a 0.001 através da função all.equal() que tem uma tolerância
para esses números serem iguais:

> xyz$y[1] == 0.001
[1] FALSE
> all.equal(xyz$y[1], 0.001)
[1] TRUE

Uma solução pra fazer o que vc quer seria:

f <- function(x){
    isTRUE(all.equal(x, 0.001))
}

idx <- sapply(xyz$y, f)

xyz[idx,]


[]s,


---
Fernando Mayer
Universidade Federal de Santa Catarina - UFSC
Departamento de Ecologia e Zoologia - ECZ/CCB
URL: http://sites.google.com/site/fernandomayer
e-mail: fernandomayer [@] gmail.com



2012/4/12 Tiago Vieira <tiagovieira7 em yahoo.com.br>:
> Frederico, o erro persiste:
>
>> fxy <- function(x,y) exp(y/x)
>> x <- seq(0.1, 0.5, l=101)
>> y <- seq(min(x^3), max(x^2), l=101)
>> z <- seq(0, max(fxy(x,y)), l=101)
>> xyz <- expand.grid(x=x,y=y,z=z)
>> head(xyz)
>       x     y z
> 1 0.100 0.001 0
> 2 0.104 0.001 0
> 3 0.108 0.001 0
> 4 0.112 0.001 0
> 5 0.116 0.001 0
> 6 0.120 0.001 0
>> subset(xyz, y==0.001, select=c(x,z))
> [1] x z
>
> <0 rows> (or 0-length row.names)
>>
> De: Frederico Stienmetz Alvarez <eng.fredericoalvarez em gmail.com>
>
> Para: r-br em listas.c3sl.ufpr.br; Tiago Vieira <tiagovieira7 em yahoo.com.br>
> Enviadas: Quinta-feira, 12 de Abril de 2012 16:03
>
> Assunto: Re: [R-br] Erro em subset
>
> Boa tarde.
>
> Experimentou colocar os dados a serem selecionados no seu subset?
>
> subset(xyz, y == 0.001, select = 'campo de interesse')
>
> Em 12 de abril de 2012 14:07, Tiago Vieira <tiagovieira7 em yahoo.com.br>
> escreveu:
>
> Caros Colegas de R,
>
> Minha dúvida parece ser simples: Eu gero um data.frame, visualizo um valor
> em uma coluna e quando peço para filtrar todas as linhas em que esta coluna
> apresenta este valor é retornado que não há linhas. Tente dois métodos de
> subset e o erro persiste. Já bati muito a cabeça e não acho razões para este
> erro. Abaixo segue os comando e, desde já, agradeço a atenção.
>
>> fxy <- function(x,y) exp(y/x)
>> x <- seq(0.1, 0.5, l=101)
>> y <- seq(min(x^3), max(x^2), l=101)
>> z <- seq(0, max(fxy(x,y)), l=101)
>> xyz <- expand.grid(x=x,y=y,z=z)
>> head(xyz)
>       x     y z
> 1 0.100 0.001 0
> 2 0.104 0.001 0
> 3 0.108 0.001 0
> 4 0.112 0.001 0
> 5 0.116 0.001 0
> 6 0.120 0.001 0
>> xyz[xyz$y==0.001,]
> [1] x y z
> <0 rows> (or 0-length row.names)
>> subset(xyz, y==0.001)
> [1] x y z
> <0 rows> (or 0-length row.names)
>
>
> Att,
> Tiago Vieira.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código
> mínimo reproduzível.
>
>
>
>
> --
> Frederico Steinmetz Alvarez
> Engenheiro de Produção Elétrica
> Mestrando em Energia Eólica
> Laboratório Didático Pedagógico de Fluidos - LDPFLU
> Departamento de Engenharia Mecânica - DEMEC
> Universidade Federal de Pernambuco - UFPE
> (81) 8885-1105 (Oi)
> (48) 9143-5141 (Vivo)
>
>
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código
> mínimo reproduzível.


Mais detalhes sobre a lista de discussão R-br