【问题标题】:R loop for applying an equation to each unique categoryR循环用于将方程应用于每个唯一类别
【发布时间】:2013-11-04 15:44:31
【问题描述】:

我正在寻求帮助以编写 R 循环来计算香农的信息内容 (SIC) 对于每个独特的单倍型。数据包括第 1 列中的单倍型和第 2 列中的单倍型频率。正如您在示例数据中看到的那样,只有 4 个独特的单倍型,每种单倍型的数量不同,频率对应于每个单倍型。所有单倍型 H* 的频率总和为 1。SIC 的方程为

Σi (πhi*log(1/(πhi)))

其中 πhi 是 hi 单倍型的频率

Haplotype   Frequency
H1  0.8278
H1  0.02248
H1  0.1494
H2  0.8238
H2  0.02248
H2  0.1497
H3  0.1497
H3  0.02248
H3  0.8244
H4  0.628
H4  0.02248
H4  0.1483
H4  0.1637
H4  0.01081
H4  0.01798

在本例中,H1 的 SIC 为

(π*0.8278*log(1/(π*0.8278))) + (π*0.02248*log(1/(π*0.02248))) + (π*0.1494*log(1/(π*0.1494) )))

最终输出应给出 4 个 SIC 值,一个对应于每个唯一的单倍型。

我相信使用lapply() 是正确的前进方法,但我的 R 技能非常初级,不知道下一步该做什么。感谢您的任何帮助。

【问题讨论】:

    标签: r loops stat genetics


    【解决方案1】:

    你想要aggregate:

    result <- aggregate(df, by = list(df$Haplotype), function (h) sic(h[2]))
    

    【讨论】:

    • 感谢您的建议。我的代码写成:
      sic result 但它给出的信息是:1/p 中的错误:二进制运算符的非数字参数
      我相信“函数”之后的代码是不正确。如果我已经将 'sic' 指定为一个函数,我需要这个吗?
    • 我稍微简化了一些——但我的代码确实有效。唯一的问题是它还尝试将转换应用于您显然不想要的Haplotype 列。但是,这给了我一个警告,而不是你的错误。
    • 好吧,我相信我现在得到的警告和你一样“在 Ops.factor(log2(1/p), p) : / 对因子没有意义”。所以我只需要将函数指向频率列。我能问一下代码的“sic(h[2])”部分在做什么吗?它是否告诉 R 将函数“sic”指向数据集的第 2 列?
    • 我想我写了一个同样有效的替代方案:“result
    • @user2895292 回答您的问题:是的,完全正确。你的第二条评论看起来确实更有希望。 :)
    【解决方案2】:
    library(plyr)
    ddply(df1,.(Haplotype),summarize,mysum=sum(pi*Frequency*log(1/(pi*Frequency))))
      Haplotype      mysum
    1        H1 -1.9433259
    2        H2 -1.9190102
    3        H3 -1.9226882
    4        H4 -0.1784109
    
    library(data.table)
    dt1<-data.table(df1)
    dt1[,list(sum=sum(pi*Frequency*log(1/(pi*Frequency)))),by=Haplotype]
       Haplotype        sum
    1:        H1 -1.9433259
    2:        H2 -1.9190102
    3:        H3 -1.9226882
    4:        H4 -0.1784109
    

    【讨论】:

    • 感谢您提供这些代码;他们产生了与“result
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2022-11-05
    • 2022-01-23
    • 1970-01-01
    • 2020-06-25
    • 2019-11-10
    相关资源
    最近更新 更多