Min and Median of Multiple Columns of a DF by Row

2020-07-18 09:58发布

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')

标签: r
5条回答
乱世女痞
2楼-- · 2020-07-18 10:13

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
查看更多
手持菜刀,她持情操
3楼-- · 2020-07-18 10:13
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.

查看更多
爷的心禁止访问
4楼-- · 2020-07-18 10:15

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
查看更多
叼着烟拽天下
5楼-- · 2020-07-18 10:18

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
查看更多
我只想做你的唯一
6楼-- · 2020-07-18 10:25
min<-apply(df,1,min)
median<-apply(df,1,median)
df$Min<-min
df$Median<-median
查看更多
登录 后发表回答