Reputation: 6799
Given a dataframe
that looks like:
V1 V2 V3
5 8 12
4 9 5
7 3 9
...
How to add columns to the dataframe
for min and median of these 3 columns, calculated for each row?
The resulting DF should look like:
V1 V2 V3 Min Median
5 8 12 5 8
4 9 5 4 5
7 3 9 3 7
...
I tried using dplyr::mutate
:
mutate(df, Min = min(V1,V2,V3))
but that takes the min of the entire dataframe and puts that value in every row. How can I get the min and median of just each row?
For Mean, I can use rowMeans
in mutate
, but there are no similar functions for min and median.
Also tried,
lapply(df[1:3], median)
but it just produces the median of each column
dd <- read.table(header = TRUE, text = 'V1 V2 V3
5 8 12
4 9 5
7 3 9')
Upvotes: 5
Views: 17772
Reputation: 13570
With dplyr
, using the function rowwise
library(dplyr)
mutate(rowwise(df), min = min(V1, V2, V3), median = median(c(V1, V2, V3)))
# Using the pipe operator %>%
df %>%
rowwise() %>%
mutate(min= min(V1, V2, V3), median = median(c(V1, V2, V3)))
Output:
Source: local data frame [3 x 5]
Groups: <by row>
V1 V2 V3 min median
(int) (int) (int) (int) (int)
1 5 8 12 5 8
2 4 9 5 4 5
3 7 3 9 3 7
Upvotes: 9
Reputation: 3833
data<- data.frame(a=1:3,b=4:6,c=7:9)
data
# a b c
# 1 1 4 7
# 2 2 5 8
# 3 3 6 9
data$Min <- apply(data,1,min)
data
# a b c Min
# 1 1 4 7 1
# 2 2 5 8 2
# 3 3 6 9 3
data$Median <-apply(data[,1:3],1,median)
data
# a b c min median
# 1 1 4 7 1 4
# 2 2 5 8 2 5
# 3 3 6 9 3 6
Hope this helped.
Upvotes: 0
Reputation: 43334
You can do it with dplyr
, but you need to group by a unique ID variable so evaluate separately for each row. If, say, V1
is definitely unique, this is pretty easy:
dat %>% group_by(V1) %>% mutate(min = min(V1, V2, V3), median = median(c(V1, V2, V3)))
If you don't have a unique ID, you can make (and delete, if you like) one pretty easily:
dat %>% mutate(id = seq_len(n())) %>% group_by(id) %>%
mutate(min = min(V1, V2, V3), median = median(c(V1, V2, V3))) %>%
ungroup() %>% select(-id)
Either way, you get
Source: local data frame [3 x 5]
V1 V2 V3 min median
(int) (int) (int) (int) (int)
1 5 8 12 5 8
2 4 9 5 4 5
3 7 3 9 3 7
Upvotes: 0
Reputation: 4995
You can use apply
like this (the 1 means calculate by row, 2 would calculate by column):
the_min <- apply(df, 1, min)
the_median <- apply(df, 1, median)
df$Min <- the_min
df$Median <- the_median
Upvotes: 5
Reputation: 1942
min<-apply(df,1,min)
median<-apply(df,1,median)
df$Min<-min
df$Median<-median
Upvotes: 0