Процентное изменение в сгруппированных данных: рассчитать по первому значению группы - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь получить процентное изменение между первым значением (одной переменной) в группе и любым другим значением (той же переменной) в той же группе.

Пример данных:

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

Я искал повсюду и находил похожие вещи, но ни одна из них мне не подходитБлагодарю.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вы хотите использовать 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

Создано в 2019-03-20 пакетом Представить (v0.2.1)

0 голосов
/ 20 марта 2019

Джейсон Айзкалнс ответил хорошо, но на всякий случай, если вы хотите сохранить свою 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    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...