使用dplyr的多列行中位数
给定以下数据集,我想计算每一行M1、M2和M3列的中位数。我正在寻找一种解决方案,将最后一列添加到数据帧中,并命名为“Median”。列名(M1:M3)不应直接使用(在原始数据集中,有更多的列,而不仅仅是3列) 我知道已经有人问过几个类似的问题。但是,大多数发布的解决方案都使用使用dplyr的多列行中位数,r,dplyr,R,Dplyr,给定以下数据集,我想计算每一行M1、M2和M3列的中位数。我正在寻找一种解决方案,将最后一列添加到数据帧中,并命名为“Median”。列名(M1:M3)不应直接使用(在原始数据集中,有更多的列,而不仅仅是3列) 我知道已经有人问过几个类似的问题。但是,大多数发布的解决方案都使用rowMeans或rowSums。我正在寻找一种解决方案,其中: 不能使用“行函数” 该解决方案是一个简单的dplyr解决方案 原因(2)是我在教初学者“小提琴” 我们可以使用rowMedians library(matr
rowMeans
或rowSums
。我正在寻找一种解决方案,其中:
原因(2)是我在教初学者“小提琴” 我们可以使用
rowMedians
library(matrixStats)
library(dplyr)
df %>%
mutate(Median = rowMedians(as.matrix(.[grep('M\\d+', names(.))])))
或者,如果我们只需要使用
tidyverse
函数,则使用collect
将其转换为“long”格式,按行
汇总
,并获取“value”列的中值
df %>%
rownames_to_column('rn') %>%
gather(key, value, starts_with('M')) %>%
group_by(rn) %>%
summarise(Median = median(value)) %>%
ungroup %>%
select(-rn) %>%
bind_cols(df, .)
或者另一个选项是
dplyr
中的rowwise()
我们可以使用rowMedians
library(matrixStats)
library(dplyr)
df %>%
mutate(Median = rowMedians(as.matrix(.[grep('M\\d+', names(.))])))
或者,如果我们只需要使用tidyverse
函数,则使用collect
将其转换为“long”格式,按行
汇总
,并获取“value”列的中值
df %>%
rownames_to_column('rn') %>%
gather(key, value, starts_with('M')) %>%
group_by(rn) %>%
summarise(Median = median(value)) %>%
ungroup %>%
select(-rn) %>%
bind_cols(df, .)
或者另一个选项是dplyr
中的rowwise()
给定带有一些数值的数据帧df
:
df <- structure(list(X0 = c(0.82046171427112, 0.836224720981912, 0.842547521493854,
0.848014287631906, 0.850943494153631, 0.85425398956647, 0.85616876970771,
0.856855792247478, 0.857471048654811, 0.857507363153284, 0.874487063791594,
1.70684558846347, 1.95711031206168, 6.84386713155156), X1 = c(0.755674148966666,
0.765242580861224, 0.774422478168495, 0.776953642833977, 0.778128315184819,
0.778611604461183, 0.778624581647491, 0.778454002430202, 1.52708579075974,
13.0356519295685, 18.0590093408357, 21.1371199340156, 32.4192814934364,
33.2355314147089), X2 = c(0.772236670327724, 0.788112332251601,
0.797695511542613, 0.804257521548174, 0.809815828400878, 0.816592605516508,
0.819421106011397, 0.821734473885381, 0.822561946509595, 0.822334970491528,
0.822404634095793, 2.66875340820162, 1.40412743557514, 6.33377768022403
), X3 = c(0.764363881671609, 0.788288196346034, 0.79927498357549,
0.805446784334039, 0.810604881970155, 0.814634331592811, 0.817002594424753,
0.818129844752095, 0.818572101954132, 0.818630700031836, 3.06323952591121,
6.4477868357554, 11.4657041958038, 9.27821049066848)), class = "data.frame", row.names = c(NA,
-14L))
我喜欢这个方法,因为你不需要搜索不同的函数来计算任何东西
例如,标准偏差:
df$sd <- sapply(
df %>% nrow %>% seq,
function(i) df[i, ] %>%
dplyr::select(X1, X2) %>%
unlist %>% sd
)
df$sd%nrow%>%seq,
函数(i)df[i,]%>%
dplyr::选择(X1,X2)%>%
未列出%>%sd
)
给定一个数据帧df
和一些数值:
df <- structure(list(X0 = c(0.82046171427112, 0.836224720981912, 0.842547521493854,
0.848014287631906, 0.850943494153631, 0.85425398956647, 0.85616876970771,
0.856855792247478, 0.857471048654811, 0.857507363153284, 0.874487063791594,
1.70684558846347, 1.95711031206168, 6.84386713155156), X1 = c(0.755674148966666,
0.765242580861224, 0.774422478168495, 0.776953642833977, 0.778128315184819,
0.778611604461183, 0.778624581647491, 0.778454002430202, 1.52708579075974,
13.0356519295685, 18.0590093408357, 21.1371199340156, 32.4192814934364,
33.2355314147089), X2 = c(0.772236670327724, 0.788112332251601,
0.797695511542613, 0.804257521548174, 0.809815828400878, 0.816592605516508,
0.819421106011397, 0.821734473885381, 0.822561946509595, 0.822334970491528,
0.822404634095793, 2.66875340820162, 1.40412743557514, 6.33377768022403
), X3 = c(0.764363881671609, 0.788288196346034, 0.79927498357549,
0.805446784334039, 0.810604881970155, 0.814634331592811, 0.817002594424753,
0.818129844752095, 0.818572101954132, 0.818630700031836, 3.06323952591121,
6.4477868357554, 11.4657041958038, 9.27821049066848)), class = "data.frame", row.names = c(NA,
-14L))
我喜欢这个方法,因为你不需要搜索不同的函数来计算任何东西
例如,标准偏差:
df$sd <- sapply(
df %>% nrow %>% seq,
function(i) df[i, ] %>%
dplyr::select(X1, X2) %>%
unlist %>% sd
)
df$sd%nrow%>%seq,
函数(i)df[i,]%>%
dplyr::选择(X1,X2)%>%
未列出%>%sd
)
您应该使用矩阵而不是data.Frame如果不能使用行函数,则可以使用聚集
方法。可以吗?应该教所有初学者应用(df[,paste0(“M”,1:3)],1,中间值)
如果初学者没有在听,尝试一些声音效果,例如beeper::beep(7)
:-)@初学者,如果没有,你可能想看看。听起来它可能对您很有用。您应该使用矩阵而不是数据。如果不能使用行函数,则可以使用聚集
方法。可以吗?应该教所有初学者应用(df[,paste0(“M”,1:3)],1,中间值)
如果初学者没有在听,尝试一些声音效果,例如beeper::beep(7)
:-)@初学者,如果没有,你可能想看看。听起来它对你来说可能是一个有用的网站。谢谢,但是一个没有行…()
函数的解决方案对我来说会更好。@初学者我以为你想要一个类似的函数,如行的意思
等等post@beginneR否则您可以使用收集的方式,即,..df%%rownames\u to\u column('rn')%%>%gather(key,value,以('i'))开头)%%>%group\u by(rn)%%>%summary(Median=Median(value))%%>%ungroup%%>%select(-rn)%%>%bind\u cols(df,)
@AntoniosK谢谢您的评论。我以为是相反的。更正我希望OP不会真的把这些方法教给初学者。akrun无意冒犯您,但dplyr并不是为此而设计的谢谢,但是一个没有行…()
函数的解决方案对我来说会更好。@初学者我以为您想要一个类似的函数,如行的意思
等,正如在post@beginneR否则您可以使用收集的方式,即,..df%%rownames\u to\u column('rn')%%>%gather(key,value,以('i'))开头)%%>%group\u by(rn)%%>%summary(Median=Median(value))%%>%ungroup%%>%select(-rn)%%>%bind\u cols(df,)
@AntoniosK谢谢您的评论。我以为是相反的。更正我希望OP不会真的把这些方法教给初学者。没有冒犯你的akrun,但dplyr并不是为此而设计的
df$sd <- sapply(
df %>% nrow %>% seq,
function(i) df[i, ] %>%
dplyr::select(X1, X2) %>%
unlist %>% sd
)