给出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')
答案 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
希望这会有所帮助。