Расчет процента увеличения и уменьшения значений между факторами - PullRequest
1 голос
/ 22 мая 2019

Я ищу способ рассчитать изменение баллов между факторами (например, баллы по опроснику до и после лечения).Я хочу выяснить, какой процент участников улучшился, а какой процент нет между Pre и Post.

Я рассмотрел некоторые dplyr решения, но мне кажется, что мне не хватает строки кода, но я не уверен.

    ID<-c("aaa","bbb","ccc","ddd","eee","fff", "ggg","aaa","bbb","ccc","ddd","eee","fff", "ggg")
    Score<-sample(40,14)
    Pre_Post<-c(1,1,1,1,1,1,1,2,2,2,2,2,2,2)
    df<-cbind(ID, Pre_Post, Score)
    df$Score<-as.numeric(df$Score)
    df<-as.data.frame(df)


    #what I have tried
    df2<-df%>%
    group_by(ID, Pre_post)
    mutate(Pct_change=mutate(Score/lead(Score)*100))

Но я получаю сообщения об ошибках.Кроме того, я не был уверен, что код был правильным с самого начала.

Ожидаемый результат: - Чего я хочу добиться, так это получить процент улучшенных идентификаторов.Таким образом, в случае ложного примера, который я привел, только 42,86% идентификаторов улучшились от Pre до Post, в то время как 57,14% фактически ухудшились между Pre и Post.

Любые предложения приветствуются:)

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

у вас есть несколько опечаток, поэтому вы получаете ошибку.

Вы можете сделать что-то вроде этого, чтобы получить старые и новые оценки бок о бок:

library(tidyverse)

df %>%
  spread(Pre_Post, Score) %>%
  rename(Score_pre = `1`, Score_post = `2`) 

   ID Score_pre Score_post
1 aaa        19         24
2 bbb        39         35
3 ccc         2         29
4 ddd        38         15
5 eee        36          9
6 fff        23         10
7 ggg        21         27

Чтобы получить количество улучшений, сначала нужно преобразовать Score в числовое значение:

df %>% as_tibble() %>% 
  mutate(Score = as.numeric(Score)) %>% 
  spread(Pre_Post, Score) %>%
  rename(Score_pre = `1`, Score_post = `2`) %>%
  mutate(improve = if_else(Score_pre > Score_post, "0", "1")) %>% 
  group_by(improve) %>% 
  summarise(n = n()) %>% 
  mutate(percentage = n / sum(n))

# A tibble: 2 x 3
  improve     n percentage
  <chr>   <int>      <dbl>
1 0           3      0.429
2 1           4      0.571
1 голос
/ 22 мая 2019

Другой вариант с dplyr, при условии, что у вас всегда есть два значения с Pre в качестве 1 и Post в качестве 2 будет group_by ID, и вычтите второе значение с первым значением и рассчитайте коэффициент для положительного и отрицательные значения.

library(dplyr)

df %>%
  arrange(ID, Pre_Post) %>%
  group_by(ID) %>%
  summarise(val = Score[2] - Score[1]) %>%
  summarise(total_pos = sum(val > 0)/n(), 
            total_neg = sum(val < 0)/ n())

# A tibble: 1 x 2
#  total_pos total_neg
#      <dbl>     <dbl>
#1     0.429     0.571

данные

ID <- c("aaa","bbb","ccc","ddd","eee","fff", "ggg","aaa","bbb",
      "ccc","ddd","eee","fff", "ggg")
Score <- sample(40,14)
Pre_Post <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2)
df <- data.frame(ID, Pre_Post, Score)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...