R 分组数据中的百分比变化:根据组的第一个值计算

R 分组数据中的百分比变化:根据组的第一个值计算,r,dplyr,mutate,R,Dplyr,Mutate,我试图得到一组中第一个值(一个变量的)和同一组中每一个值(同一个变量的)之间的百分比变化 示例数据: 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 r

我试图得到一组中第一个值(一个变量的)和同一组中每一个值(同一个变量的)之间的百分比变化

示例数据:

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

我到处寻找,发现了相似的东西,但没有一件是我想要的。谢谢

您想先使用
first()

库(tidyverse)
df=data.frame(
组=c(代表('A',4),代表('B',3)),
响应=c(1,4,2,1,1,2,3),
治疗=c(“对照组”、“100mg”、“200mg”、“50mg”、“对照组”、“100mg”、“200mg”)
)
df%>%
分组依据(分组)%>%
变异(
从第一个响应到第二个响应=(响应/第一个(响应)-1)*100
)
#>#tibble:7 x 4
#>#组:组[2]
#>组反应治疗分别从第一组开始
#>                               
#>1 A 1控件0
#>2 A 4 100mg 300
#>3 A 2 200mg 100
#>4 A 1 50mg 0
#>5b1控制0
#>6B2100mg100
#>7 B 3 200mg 200

由(v0.2.1)于2019-03-20创建的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    
pct-perchange
#一个tibble:7x3
#分组:分组[2]
群体反应治疗
1 A 0控件
2 A 300 100mg
3 A 100 200mg
4A050mg
5b0控制
6 B 100毫克
7 B 200毫克

控制治疗是否有必要
NA
?或者
0
(技术上准确)可以吗?此外,数据是否有序?也就是说,
控制
是否总是第一位,或者匹配
治疗
值以找到第一个值是否很重要?@divibisan是的-理想情况下,0是最好的!我通常会对数据进行排序,以便在组中首先进行控制。谢谢,谢谢@nsinghs!接受另一个,因为这似乎比我尝试过的更优雅,但我很感激知道我在功能上哪里出了问题谢谢。
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