【问题标题】:Calculating ratios by group with dplyr使用 dplyr 按组计算比率
【发布时间】:2015-04-13 18:46:30
【问题描述】:

使用以下数据框,我想通过复制和分组对数据进行分组,然后计算处理值与控制值的比率。

structure(list(group = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L), .Label = c("case", "controls"), class = "factor"), treatment = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "EPA", class = "factor"), 
    replicate = structure(c(2L, 4L, 3L, 1L, 2L, 4L, 3L, 1L), .Label = c("four", 
    "one", "three", "two"), class = "factor"), fatty_acid_family = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "saturated", class = "factor"), 
    fatty_acid = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "14:0", class = "factor"), 
    quant = c(6.16, 6.415, 4.02, 4.05, 4.62, 4.435, 3.755, 3.755
    )), .Names = c("group", "treatment", "replicate", "fatty_acid_family", 
"fatty_acid", "quant"), class = "data.frame", row.names = c(NA, 
-8L))

我尝试使用 dplyr 如下:

group_by(dataIn, replicate, group) %>% transmute(ratio = quant[group=="case"]/quant[group=="controls"])

但这会导致Error: incompatible size (%d), expecting %d (the group size) or 1

最初我认为这可能是因为我试图从 df 8 行深创建 4 个比率,所以我认为summarise 可能是答案(将每个组折叠为一个比率)但这也不起作用(我的理解是一个缺点)。

group_by(dataIn, replicate, group) %>% summarise(ratio = quant[group=="case"]/quant[group=="controls"])

  replicate    group ratio
1      four     case    NA
2      four controls    NA
3       one     case    NA
4       one controls    NA
5     three     case    NA
6     three controls    NA
7       two     case    NA
8       two controls    NA

我会很感激一些关于我哪里出错的建议,或者即使这可以通过dplyr 来完成。

谢谢。

【问题讨论】:

  • 不要按group分组

标签: r dplyr


【解决方案1】:

你可以试试:

group_by(dataIn, replicate) %>% 
    summarise(ratio = quant[group=="case"]/quant[group=="controls"])
#Source: local data frame [4 x 2]
#
#  replicate    ratio
#1      four 1.078562
#2       one 1.333333
#3     three 1.070573
#4       two 1.446449

由于您按副本和组分组,您无法同时访问来自不同组的数据。

【讨论】:

  • 谢谢,就像一个魅力。我想我理解“组”问题,但我需要使用 dplyr 并再次阅读文档。
  • 嗨,我有许多“处理过的”数据集(即本例中的“案例”)与一组单一的“对照”值。您不必指定“案例”来迭代案例(我添加了复数)。即summarise(ratio = quant / quant[group=="controls"])
【解决方案2】:

@talat's answer 为我解决了。我创建了一个可重复的最小示例来帮助我自己理解:

df <- structure(list(a = c("a", "a", "b", "b", "c", "c", "d", "d"), 
    b = c(1, 2, 1, 2, 1, 2, 1, 2), c = c(22, 15, 5, 0.2, 107, 
    6, 0.2, 4)), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))

#   a b     c
# 1 a 1  22.0
# 2 a 2  15.0
# 3 b 1   5.0
# 4 b 2   0.2
# 5 c 1 107.0
# 6 c 2   6.0
# 7 d 1   0.2
# 8 d 2   4.0

library(dplyr)

df %>%  
  group_by(a) %>% 
  summarise(prop = c[b == 1] / c[b == 2])

#   a      prop
# 1 a  1.466667
# 2 b 25.000000
# 3 c 17.833333
# 4 d  0.050000

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多