【问题标题】:ddply to apply function on data by groupsddply 按组对数据应用函数
【发布时间】:2017-09-08 01:54:14
【问题描述】:

情况:

这是我拥有的数据:

> head(data1)
  CHROM   POS REF ALT DIFF GT
1 chr01 14653   C   T  254 CT     
2 chr01 14907   A   G  254 AG     
3 chr01 14930   A   G   23 AG     
4 chr01 15190   G   A  260 GA     
5 chr01 15211   T   G   21 TG     
6 chr01 16378   T   C 1167 TC     

> tail(data1)
154176  chrX 154901366   T   A 58700 TA     
154177  chrX 154901404   A   T    38 AT     
154178  chrX 154933406   A   G 32002 AG     
154179  chrX 154933419   A   T    13 AT     
154180  chrX 154933451   T   C    32 TC     
154181  chrX 154933473   G   T    22 GT     
  • CHROM 的分类值从 chr01 到 chr22 加上 chrX(共 23 个)
  • GT 是分类的(A C G T 的两个组合)(总共 12 种可能性)

我想做的事:

  1. 按 1e7 分组 POS。我已经使用 data1$POSgroup
  2. 计算每个 POSgroup CHROM 组的平均值。所以我应该将总共 #POSgroup *#CHROM 平均值作为一个数据集。

我现在的代码只能得到按 POS 组而不是 CHROM 组分组的平均值。

代码:

datsum <- ddply(data1, .var = "POSgroup", .fun = function(x) {

  # Calculate the mean DIFF value for each GT group in this POSgroup
  meandiff <- ddply(x, .var = "GT", .fun = summarise, ymean = mean(DIFF))

  # Add the center of the POSgroup range as the x position
  meandiff$center <- (x$POSgroup[1] * 1e7) + 0.5e7

  # Return the results
  meandiff

})

谁能帮我解决这个问题?

【问题讨论】:

    标签: r grouping plyr mean var


    【解决方案1】:

    使用data.table,这将为您提供一个起点:

    library(data.table)
    dt = data.table(data1)
    
    dt[, mean(DIFF), by = list(floor(CHROM/1e7), floor(POS/1e7))]
    

    【讨论】:

    • 这行得通。我还有一个问题。你能看看这个帖子吗? stackoverflow.com/questions/21532790/… 并通过马特帕克给出的解决方案。我试图将其融入该解决方案,但失败了,您能弄清楚这一点吗?谢谢。该情节正是我想要的,只需按 chr* 分组为 :stackoverflow.com/questions/21489385/… 中的情节。谢谢!
    • @YilunZhang 我建议添加另一个问题,解释你想要什么,你试过什么,什么没用
    • @YilunZhang 这太棒了,但我实际上来这个问题是为了寻找ddply() 的答案;)
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2017-02-14
    • 2023-03-24
    相关资源
    最近更新 更多