【问题标题】:Percentage change in grouped data: calculate against first value of group分组数据的百分比变化:根据组的第一个值计算
【发布时间】:2019-08-11 13:09:49
【问题描述】:

我正在尝试获取组中的第一个值(一个变量的)与同一组中的每个其他值(同一变量的)之间的百分比变化。

示例数据:

df = data.frame(group = c(rep('A',4), rep('B',3)),
            response = c(1,4,2,1,1,2,3),
            treatment = c("control","100mg","200mg","50mg","control","100mg","200mg"))

> df
    group response treatment
       A     1   control
       A     4     100mg
       A     2     200mg
       A     1      50mg
       B     1   control
       B     2     100mg
       B     3     200mg

换句话说,我想得到百分比变化 响应相对于同一组中所有其他治疗水平的治疗“对照”。 治疗的级别数可能因组而异。

到目前为止我所拥有的:

# function for % change
pct <- function(x) {(x/lag(x)-1)*100}

library(dplyr)
# group data and apply function
percChange <- df %>% 
  group_by(group) %>% 
  mutate_at(vars(response), funs(pct))

# the output (perChange) is:

#   group response treatment
# 1 A        NA   control  
# 2 A       300   100mg    
# 3 A       -50   200mg    
# 4 A       -50   50mg     
# 5 B        NA   control  
# 6 B       100   100mg    
# 7 B        50   200mg

但我想要的输出是:

# group  response  treatment
# 1 A        NA   control  
# 2 A       300   100mg    
# 3 A       100   200mg    
# 4 A       0     50mg     
# 5 B       NA    control  
# 6 B       100   100mg    
# 7 B       200   200mg

我到处寻找,发现了类似的东西,但没有一个是我所追求的。谢谢。

【问题讨论】:

  • 对照处理具有NA 是否重要?或者0(技术上准确)好吗?另外,数据是否有序?也就是说,control 是否总是第一个,或者匹配 treatment 值以找到第一个值很重要?
  • @divibisan 是的,你是对的——最好是 0!我通常对数据进行排序,因此控制将是组中的第一位。谢谢。

标签: r dplyr


【解决方案1】:

JasonAizkalns 回答得很好,但以防万一您想保留 pct 功能。只需在您的 pct 函数中修复一个小错误即可使其正常工作。

pct <- function(x) {
  ((x-x[1])/x[1]) * 100
}

> percChange
# A tibble: 7 x 3
# Groups:   group [2]
  group response treatment
  <fct>    <dbl> <fct>    
1 A            0 control  
2 A          300 100mg    
3 A          100 200mg    
4 A            0 50mg     
5 B            0 control  
6 B          100 100mg    
7 B          200 200mg    

【讨论】:

  • 谢谢@nsinghs!接受了另一种方法,因为它似乎比我尝试过的方法更优雅,但我很高兴知道我的功能哪里出了问题,谢谢。
【解决方案2】:

你想使用first():

library(tidyverse)

df = data.frame(
  group = c(rep('A',4), rep('B',3)),
  response = c(1,4,2,1,1,2,3),
  treatment = c("control","100mg","200mg","50mg","control","100mg","200mg")
)

df %>%
  group_by(group) %>%
  mutate(
    resp_pct_chg_from_first = (response / first(response) - 1) * 100
  )
#> # A tibble: 7 x 4
#> # Groups:   group [2]
#>   group response treatment resp_pct_chg_from_first
#>   <fct>    <dbl> <fct>                       <dbl>
#> 1 A            1 control                         0
#> 2 A            4 100mg                         300
#> 3 A            2 200mg                         100
#> 4 A            1 50mg                            0
#> 5 B            1 control                         0
#> 6 B            2 100mg                         100
#> 7 B            3 200mg                         200

reprex package (v0.2.1) 于 2019-03-20 创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2021-03-16
    • 2019-04-03
    • 2022-01-26
    相关资源
    最近更新 更多