dplyr如何汇总和分割返回向量的函数的结果

时间:2019-01-12 03:10:04

标签: r dplyr

您好,我需要在此data.frame中按基因进行总结。

g1 = data.frame ( 
      gene = c( "a","a","a","a","b"),
      value = c(1,200,3,5,0)
    )
  gene value
1    a     1
2    a   200
3    a     3
4    a     5
5    b     0

我想做的是按基因进行聚合,但是要使用一个返回两个变量的函数。对于此示例,可以说此函数返回均值和中位数。

mn <- function ( x ){
    return  ( c( median(x), mean(x) ))
}

因为该函数返回一个向量,所以我需要调用它两次。有没有一种方法可以拆分结果,这样我就不必计算两次了?

g1 %>%
    group_by(gene) %>%
    dplyr::summarize(
        median = mn ( value )[1],  # because mn returns a vector I need to call it twice
        mean = mn ( value )[2]
    ) %>%
    data.frame()

2 个答案:

答案 0 :(得分:1)

您无法使用dplyr来做到这一点,但可以使用data.table来做到这一点

library(data.table)

g1 = data.table ( 
  gene = c( "a","a","a","a","b"),
  value = c(1,200,3,5,0))


mn <- function(x){
  return(list(med = median(x), mean = mean(x)))
}


g1[, mn(value), by = gene]

答案 1 :(得分:1)

您可以使用dplyr进行此操作,尽管它不一定像其他解决方案那样直观。 package com.example import android.databinding.DataBindingUtil import android.os.Bundle import android.support.v7.app.AppCompatActivity import com.example.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var activityMain:ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) activityMain.data = Thing() } } 函数将起作用。注意-我修改了do()函数,为返回的向量分配名称。

这里是mn()的{​​{3}}。棘手的部分是如何使用do()表示法传递对象。

.$

reference page(v0.2.1)于2019-01-11创建

在不深入探讨library(dplyr) g1 = data.frame ( gene = c( "a","a","a","a","b"), value = c(1,200,3,5,0) ) mn <- function (x){ return(c(median = median(x), mean = mean(x))) } g1 %>% group_by(gene) %>% do(data.frame(t(mn(.$value)))) %>% data.frame() #> gene median mean #> 1 a 4 52.25 #> 2 b 0 0.00 data.table之间的情况下,以下是在中等大小的数据块上这两种解决方案之间的时间比较:

dplyr

reprex package(v0.2.1)于2019-01-11创建