Back

Explore Courses Blog Tutorials Interview Questions
0 votes
3 views
in R Programming by (5.3k points)

When working with plyr I often found it useful to use adply for scalar functions that I have to apply to each and every row.

e.g.

data(iris)

library(plyr)

head(

     adply(iris, 1, transform , Max.Len= max(Sepal.Length,Petal.Length))

    )

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len

1          5.1         3.5          1.4         0.2  setosa     5.1

2          4.9         3.0          1.4         0.2  setosa     4.9

3          4.7         3.2          1.3         0.2  setosa     4.7

4          4.6         3.1          1.5         0.2  setosa     4.6

5          5.0         3.6          1.4         0.2  setosa     5.0

6          5.4         3.9          1.7         0.4  setosa     5.4

Now I'm using dplyr more, I'm wondering if there is a tidy/natural way to do this? As this is NOT what I want:

library(dplyr)

head(

     mutate(iris, Max.Len= max(Sepal.Length,Petal.Length))

    )

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len

1          5.1         3.5          1.4         0.2  setosa     7.9

2          4.9         3.0          1.4         0.2  setosa     7.9

3          4.7         3.2          1.3         0.2  setosa     7.9

4          4.6         3.1          1.5         0.2  setosa     7.9

5          5.0         3.6          1.4         0.2  setosa     7.9

6          5.4         3.9          1.7         0.4  setosa     7.9

1 Answer

0 votes
by

You can use the rowwise() function from the dplyr package that used to support arbitrary complex operations that need to be applied to each row.

i.e.,

iris %>% 

  rowwise() %>% 

  mutate(Max.Len= max(Sepal.Length,Petal.Length))

Source: local data frame [150 x 6]

Groups: <by row>

# A tibble: 150 x 6

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len

          <dbl>       <dbl>        <dbl>       <dbl> <fct>     <dbl>

 1          5.1         3.5          1.4         0.2 setosa      5.1

 2          4.9         3            1.4         0.2 setosa      4.9

 3          4.7         3.2          1.3         0.2 setosa      4.7

 4          4.6         3.1          1.5         0.2 setosa      4.6

 5          5           3.6          1.4         0.2 setosa      5  

 6          5.4         3.9          1.7         0.4 setosa      5.4

 7          4.6         3.4          1.4         0.3 setosa      4.6

 8          5           3.4          1.5         0.2 setosa      5  

 9          4.4         2.9          1.4         0.2 setosa      4.4

10          4.9         3.1          1.5         0.1 setosa      4.9

# ... with 140 more rows

Browse Categories

...