【问题标题】:get frequency based on two columns根据两列获取频率
【发布时间】:2019-02-26 20:08:12
【问题描述】:

我的大型数据框的 sn-p 看起来是这样的:

MARKERS.IN.HAPLOTYPES BASE           rs. alleles chrom       pos        GID marker   trial
                 1A.12    C S1A_494392059     C/G    1A 494392059 GID7173723      2 ES26-38
                 1A.13    C S1A_497201550     C/T    1A 497201550 GID7173723      0 ES26-38
                 1A.14    T S1A_499864157     C/T    1A 499864157 GID7173723      2 ES26-38
                 1B.10    A S1B_566171302     G/A    1B 566171302 GID7173723      0 ES26-38
                 1B.20    G S1B_642616640     A/G    1B 642616640 GID7173723      2 ES26-38
                 2B.10    A  S2B_24883552     A/G    2B  24883552 GID7173723      2 ES26-38

这是其中的dput

structure(list(MARKERS.IN.HAPLOTYPES = c("1A.12", "1A.13", "1A.14", 
"1B.10", "1B.20", "2B.10"), BASE = c("C", "C", "T", "A", "G", 
"A"), rs. = c("S1A_494392059", "S1A_497201550", "S1A_499864157", 
"S1B_566171302", "S1B_642616640", "S2B_24883552"), alleles = c("C/G", 
"C/T", "C/T", "G/A", "A/G", "A/G"), chrom = c("1A", "1A", "1A", 
"1B", "1B", "2B"), pos = c(494392059L, 497201550L, 499864157L, 
566171302L, 642616640L, 24883552L), GID = c("GID7173723", "GID7173723", 
"GID7173723", "GID7173723", "GID7173723", "GID7173723"), marker = c("2", 
 "0", "2", "0", "2", "2"), trial = c("ES26-38", "ES26-38", "ES26-38", 
 "ES26-38", "ES26-38", "ES26-38")), row.names = c(NA, 6L), class = 
 "data.frame")

原始数据框中rs. 列有22 个unique 值,trial 列有6 个unique 值。我想为每个唯一的rs. 和每个唯一的trial 计算列marker 的不同值的相对频率。例如,rs.S1A_494392059 列的第一项将具有marker 列的频率,用于试验ES26-38 等等。请注意,marker 列是一个字符向量,而不是数字。

【问题讨论】:

  • 或许你可以试试df %>% group_by(trial, marker, rs.) %>% tally()
  • 或者只是df %>% add_count(rs., trial, marker)。如果您使用dplyr 0.8 或更高版本,您还可以通过参数定制name
  • 对不起。我的意思是marker 列的相对频率
  • 通过参数定制名称是什么意思?

标签: r dplyr tibble


【解决方案1】:

你可以试试这个:

library(dplyr)

df %>%
  add_count(rs., trial, name = "Total") %>%
  add_count(rs., trial, marker, name = "MarkerTotal") %>%
  mutate(RelativeFreq = round(MarkerTotal / Total, 2))

add_count 中的 name 列是 dplyr 0.8 以后的新功能,允许您决定名称(以前默认为 nnn)。如果您没有更新包,上述代码将无法工作。

您的示例中的相对频率在任何地方都是 1,因为它并不是特别复杂。

如果您想获得一个汇总数据框,您可以这样做(其中唯一的列将分组rs.trialRelativeFreq):

df %>% 
  add_count(rs., trial, marker, name = "MarkerTotal") %>%
  group_by(rs., trial) %>%
  summarise(RelativeFreq = round(MarkerTotal / n(), 2))

【讨论】:

  • 非常感谢。我正在尝试使用semi_joininner_join 从汇总数据框中获取base 列,但第一个不起作用,第二个将数据扩展到许多其他行。
  • 不客气!对于连接,您需要发布和详细说明,因为我想不出简单的东西;最好用例子打开一个新话题(最好用dput)。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多