Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr的多列行中位数_R_Dplyr - Fatal编程技术网

使用dplyr的多列行中位数

使用dplyr的多列行中位数,r,dplyr,R,Dplyr,给定以下数据集,我想计算每一行M1、M2和M3列的中位数。我正在寻找一种解决方案,将最后一列添加到数据帧中,并命名为“Median”。列名(M1:M3)不应直接使用(在原始数据集中,有更多的列,而不仅仅是3列) 我知道已经有人问过几个类似的问题。但是,大多数发布的解决方案都使用rowMeans或rowSums。我正在寻找一种解决方案,其中: 不能使用“行函数” 该解决方案是一个简单的dplyr解决方案 原因(2)是我在教初学者“小提琴” 我们可以使用rowMedians library(matr

给定以下数据集,我想计算每一行M1、M2和M3列的中位数。我正在寻找一种解决方案,将最后一列添加到数据帧中,并命名为“Median”。列名(M1:M3)不应直接使用(在原始数据集中,有更多的列,而不仅仅是3列)

我知道已经有人问过几个类似的问题。但是,大多数发布的解决方案都使用
rowMeans
rowSums
。我正在寻找一种解决方案,其中:

  • 不能使用“行函数”
  • 该解决方案是一个简单的dplyr解决方案

  • 原因(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
    )