【问题标题】:Is there a way to add frequency counts together in a for loop? [duplicate]有没有办法在 for 循环中将频率计数加在一起? [复制]
【发布时间】:2019-08-12 20:55:56
【问题描述】:

我有一个大数据框(n=553),等位基因列有 3 个级别(0、1、2),范围列有 2 个级别(正常和高)。

dd <- data.frame(
  Allele = c(0, 0, 1, 1, 2, 2), 
  Range = c("High", "Normal", "High", "Normal", "High", "Normal"), 
  Frequency = c(1L, 2L, 9L, 7L, 28L, 17L)
)

我希望能够获取整个数据框并将其转换为 2x3 表,其中输出将等位基因列和范围作为行

我遇到的问题是我希望能够添加与行匹配的所有频率计数,即如果等位基因 = 0 和范围 = 正常,然后将所有匹配行的频率加在一起。

感觉有一个简单的解决方案,但我似乎想不出一个。非常感谢任何帮助

【问题讨论】:

  • 欢迎来到 SO!你能显示预期的输出吗? (+1 用于可重现的示例)
  • 您描述的第一部分似乎是从长数据到宽数据的简单重塑,但是添加频率是什么意思?您是否期望对给定的等位基因和范围组合进行多次观察?如果是这样,您需要在示例数据中添加一些示例
  • 可能是xtabs(Frequency ~ Range + Allele, dd)
  • @camille 例如,数据帧的第一行是 0 Normal 1,假设数据帧下方的某处有另一行,行 0 Normal 10。输出应将 1+10 加在一起为以及任何其他具有 0 和 Normal 的行
  • reshape2::dcast(data = dd, formula = Allele ~ Range, value.var = "Frequency", fun.aggregate = sum)

标签: r


【解决方案1】:

1

m = sapply(unique(dd$Allele), function(x)
    sapply(unique(dd$Range), function(y){
        sum(dd$Frequency[dd$Allele == x & dd$Range == y])
    }))
dimnames(m) = list(Range = unique(dd$Range), Allele = unique(dd$Allele))
m
#        Allele
#Range    0 1  2
#  High   1 9 28
#  Normal 2 7 17

2

with(dd, tapply(Frequency, list(Range, Allele), sum))
#       0 1  2
#High   1 9 28
#Normal 2 7 17

3

library(reshape2)
dcast(dd, Range ~ Allele, value.var = "Frequency", fun.aggregate = sum)
#   Range 0 1  2
#1   High 1 9 28
#2 Normal 2 7 17

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多