Расчет условных предложений с использованием мутата - PullRequest
1 голос
/ 27 марта 2020

Я работаю с таким набором данных.

library(magrittr)
library(tidyverse)

time<- c("day1", "day1", "day1", "day2", "day2", "day2", "day3", "day3", "day3")
indviduals<- c(23,25,26,22,24,20,21,23,15)
treatment<- c(rep(c("a", "b", "c")))
dat<-NULL

dat <- dat %>% cbind(treatment, time, indviduals)%>%
  as.data.frame(stringAsFactors=F)
str(dat)

Я хочу знать, как рассчитать процент людей, живущих по дням и по лечению. Другими словами, я хочу четвертую колонку, которая дает мне долю отдельных "живых". Я хочу взять индивидуумов в 1-й день минус индивидуумы в день 2, разделить их на 100 и делать это для каждого дня и лечения.

То, что я хочу, выглядит примерно так:

  dat$prop<- c(1, 1,1,.99,.99,.94, .98, .98, .89)

я действительно ценю некоторую проницательность! Спасибо!

Я пытался использовать сбор и затем мутировать, но я не уверен, что поставить в качестве аргумента внутри mutate ()

>   dat <- dat %>%
>     gather(time, individuals, -treatment) %>%
>     group_by(treatment, day) %>%
>     mutate("prop" = 1 - ((#first value of ind day 1 - #value of ind day 2) / 100 by treatment))

1 Ответ

0 голосов
/ 27 марта 2020

В dplyr мы можем group_by treatment и вычислить prop, вычитая first значение в indviduals на indviduals, деленное на 100.

library(dplyr)

dat %>% 
  group_by(treatment) %>% 
  mutate(prop = 1 - (first(indviduals) - indviduals)/100)


#  time  indviduals treatment  prop
#  <chr>      <dbl> <chr>     <dbl>
#1 day1          23 a          1   
#2 day1          25 b          1   
#3 day1          26 c          1   
#4 day2          22 a          0.99
#5 day2          24 b          0.99
#6 day2          20 c          0.94
#7 day3          21 a          0.98
#8 day3          23 b          0.98
#9 day3          15 c          0.89

Это может также можно выполнить в базе R, используя ave

dat$prop <- with(dat, 1 - (ave(indviduals, treatment, 
                 FUN = function(x) x[1]) - indviduals)/100)

или используя data.table:

library(data.table)
setDT(dat)[, prop := 1 - (first(indviduals) - indviduals)/100, treatment]

data

dat <- data.frame(time, indviduals, treatment, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...