您好,我需要在此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()
答案 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创建