【问题标题】:Get frequency using two groupings in a dataframe使用数据框中的两个分组获取频率
【发布时间】:2015-04-05 12:08:22
【问题描述】:

我有一个如下的数据框(称为 dat)

chr   chrStart  chrEnd  Gene    RChr    RStart  REnd    Rname   distance
chr1    39841   39883   Gene1   chr1    398     3984    Cha1b   0
chr1    39841   39883   Gene1   chr1    398     3985    Ab      0
chr1    39841   39883   Gene1   chr1    398     3986    Tia     0
chr1    39841   39883   Gene1   chr1    398     3987    MEA     0
chr1    39841   39883   Gene1   chr1    398     3988    La      0
chr1    39841   39883   Gene1   chr1    398     3989    M3      0
chr1    14893   15893   Gene2   chr1    398     3984    Cha1b   0
chr1    14893   15893   Gene2   chr1    398     3985    Cha1b   0
chr1    14893   15893   Gene2   chr1    398     3986    Cha1b   0
chr1    14893   15893   Gene2   chr1    398     3987    MEA     0
chr1    14893   15893   Gene2   chr1    398     3988    MEA     0
chr1    39841   39883   Gene1   chr1    398     3989    M3      0

我想得到每个基因出现不同类型 Rname 的频率,所以上面的结果应该是这样的

Gene     Rname      Freq
Gene1    Cha1b       1
Gene1      Ab        1
Gene1     Tia        1
Gene1     MEA        1
Gene1     La         1
Gene1     M3         1
Gene2    Cha1b       3
Gene2    MEA         2
Gene2     M3         1

我尝试使用 dplyr 进行两个分组,但我认为这没有任何意义,而且它只是给了我每个基因的所有 Rname 的频率

library(dplyr)
GroupTbb <- dat %>% 
                group_by(Gene) %>% 
                group_by(Rname) %>% 
                summarise(freq = sum(Rname))

【问题讨论】:

  • base R 选项是 subset(as.data.frame(table(dat[c('Gene', 'Rname')])), Freq!=0)

标签: r


【解决方案1】:

您应该使用n()(因为您不能对非数字值求和)来计算观察值,并且您可以一次按两个变量分组。

dat %>% 
  group_by(Gene, Rname) %>% 
  summarise(freq = n())

# Source: local data frame [8 x 3]
# Groups: Gene
# 
# Gene Rname freq
# 1 Gene1    Ab    1
# 2 Gene1 Cha1b    1
# 3 Gene1    La    1
# 4 Gene1    M3    2
# 5 Gene1   MEA    1
# 6 Gene1   Tia    1
# 7 Gene2 Cha1b    3
# 8 Gene2   MEA    2

或使用tally,如

dat %>% 
  group_by(Gene, Rname) %>% 
  tally()

或者(如@hrbrmstr 建议的那样)您可以使用count 跳过分组步骤

dat %>%
  count(Gene, Rname)

【讨论】:

  • 如果我想把它变成这样的格式,以便我在行中有 Gene Name,在列中有 Rname,我该怎么做(如有必要,很高兴提出一个单独的问题)
  • @user362206 只需在 cmets 中使用table,否则您可能需要来自tidyrspread 或来自reshape2dcast
【解决方案2】:

你可以试试data.table:

library(data.table)
setDT(dat)[,list(count=.N), list(Gene, Rname)]

#    Gene Rname count
#1: Gene1 Cha1b     1
#2: Gene1    Ab     1
#3: Gene1   Tia     1
#4: Gene1    M3     2
#5: Gene2 Cha1b     3
#6: Gene2   MEA     2
#7: Gene1   MEA     1
#8: Gene1    La     1

【讨论】:

  • 这个也给了我想要的,但决定去上面那个
  • 没问题!如果您更喜欢 dplyr,当然可以随意使用它;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多