On Wed, 2007-10-10 at 15:43 -0400, Georg Ehret wrote:
> Dear R,
>    I am writing a simple function to extract the sign of values and apply it
> to a data frame (see below). Whatever I do I get error-messages... What is
> wrong?
> 
> Thanking you in advance,
> Cheers, Georg.
> ***********************
> Georg Ehret
> Institute of Genetic Medicine
> Johns Hopkins University
> Baltimore
> 
> 
> > extractsign<-function(x){
> +             if (x<0) a<--1
> +             else a<-1
> +             return (a)
> +             }
> > a
>            meanSBP meanSBP_tttcorr res_asb_SBP res_asb_SBP_tttcorr meanDBP
> meanDBP_tttcorr res_asb_DBP res_asb_DBP_tttcorr
> one          -0.04           -0.01       -0.11               -0.05
> 0.18
> 0.24        0.18                0.24
> two           0.06            0.01        0.33                0.24
> 0.00
> -0.02        0.05                0.03
> three        -0.01            0.01       -0.07               -0.01
> -0.01
> 0.00       -0.05               -0.01
> four         -0.14           -0.05       -0.05                0.00
> -0.85
> -0.59       -0.79               -0.55
> five          0.12            0.06        0.17                0.07
> 0.34
> 0.21        0.60                0.44
> six          -0.06           -0.01       -0.05               -0.01
> -0.26
> -0.14       -0.41               -0.25
> > lapply(a,extractsign)
> $meanSBP
> [1] -1
> 
> $meanSBP_tttcorr
> [1] -1
> 
> $res_asb_SBP
> [1] -1
> 
> $res_asb_SBP_tttcorr
> [1] -1
> 
> $meanDBP
> [1] 1
> 
> $meanDBP_tttcorr
> [1] 1
> 
> $res_asb_DBP
> [1] 1
> 
> $res_asb_DBP_tttcorr
> [1] 1
> 
> Warning messages:
> 1: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 2: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 3: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 4: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 5: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 6: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 7: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used
> 8: In if (x < 0) a <- -1 else a <- 1 :
>   the condition has length > 1 and only the first element will be used

Georg,

It is because your function is not "vectorized" and you are passing
multiple values to it in lapply(). Thus, only the first value will be
used within your function.  You appear to have 8 columns, thus you get 8
errors. Also note that you are only getting one value back per column.

Rather than re-inventing the wheel, see ?sign, which is vectorized:

x <- rnorm(10)

> x
 [1] -0.51367965  0.59760260  0.09720687  0.78494269  2.67081325
 [6] -1.16379829  0.24845122  0.09277555 -0.08928070  0.17995800

> sign(x)
 [1] -1  1  1  1  1 -1  1  1 -1  1


Or for a data frame:

> head(iris)[, -5]
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4


> lapply(head(iris)[, -5], sign)
$Sepal.Length
[1] 1 1 1 1 1 1

$Sepal.Width
[1] 1 1 1 1 1 1

$Petal.Length
[1] 1 1 1 1 1 1

$Petal.Width
[1] 1 1 1 1 1 1



HTH,

Marc Schwartz

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to