R中Row的多列的最小值和中值

时间:2016-03-09 21:20:18

标签: r

给出dataframe看起来像:

V1  V2  V3
5   8   12
4   9   5
7   3   9
...

如何为每行计算这3列的最小值和中位数dataframe添加列?

生成的DF应如下所示:

V1  V2  V3  Min  Median
5   8   12  5    8
4   9   5   4    5
7   3   9   3    7
...

我尝试使用dplyr::mutate

mutate(df, Min = min(V1,V2,V3)) 

但是它占用了整个数据帧的最小值并将该值放在每一行中。我怎样才能获得每一行的最小值和中位数?

对于Mean,我可以在rowMeans中使用mutate,但是min和median没有相似的函数。

也尝试了,

lapply(df[1:3], median)

但它只产生每列的中位数

dd <- read.table(header = TRUE, text = 'V1  V2  V3
5   8   12
4   9   5
7   3   9')

5 个答案:

答案 0 :(得分:6)

使用dplyr

功能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)))

输出:

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

答案 1 :(得分:2)

您可以像这样使用apply(1表示按行计算,2表示按列计算):

the_min <- apply(df, 1, min)   
the_median <- apply(df, 1, median)
df$Min <- the_min
df$Median <- the_median

答案 2 :(得分:0)

min<-apply(df,1,min)
median<-apply(df,1,median)
df$Min<-min
df$Median<-median

答案 3 :(得分:0)

您可以使用dplyr执行此操作,但需要按唯一ID变量进行分组,以便对每行进行单独评估。如果,V1绝对是唯一的,这很容易:

dat %>% group_by(V1) %>% mutate(min = min(V1, V2, V3), median = median(c(V1, V2, V3)))

如果您没有唯一的ID,可以轻松制作(并删除,如果您愿意):

dat %>% mutate(id = seq_len(n())) %>% group_by(id) %>% 
  mutate(min = min(V1, V2, V3), median = median(c(V1, V2, V3))) %>% 
  ungroup() %>% select(-id)

无论哪种方式,你得到

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

答案 4 :(得分:0)

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

希望这会有所帮助。