Вычитая ответ «контроля» всем остальным группам - PullRequest
0 голосов
/ 11 октября 2018

У меня есть ряд процедур с повторными измерениями, и я хотел бы вычесть значения контроля для каждой временной точки для каждой процедуры.Набор данных имеет такую ​​форму, с несколькими годами, видами и обработками.

 ID Year Species Treatment value
 1  2010  x       control   0.04
 1  2011  x       control   0.10
 2  2010  x       MaxDamage 0.02
 2  2011  x       MaxDamage 0.06

Я хотел бы добавить столбец

 difference =( value of the Treatment for each year - value of the control for each year)

 ID Year Species Treatment value  difference
 1  2010  x       control   0.04   0
 1  2011  x       control   0.1    0
 2  2010  x       MaxDamage 0.02  -0.02
 2  2011  x       MaxDamage 0.06  -0.04

Любое предложение будет приветствоваться, спасибо

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете присоединиться к таблице, содержащей контрольные значения:

library(data.table)
setDT(DF)

DF[
  DF[Treatment == "control", .(Year, c_value = value)], 
  on=.(Year), 
  d := value - c_value
][]

# or
library(dplyr)

left_join(DF, 
  DF %>% filter(Treatment == "control") %>% select(Year, c_value = value)
) %>% mutate(d = value - c_value) %>% select(-c_value)

Способ data.table изменяет DF, в то время как dplyr создает новую таблицу.

Используемые данные:

DF = structure(list(ID = c(1L, 1L, 2L, 2L), Year = c(2010L, 2011L, 
2010L, 2011L), Species = c("x", "x", "x", "x"), Treatment = c("control", 
"control", "MaxDamage", "MaxDamage"), value = c(0.04, 0.1, 0.02, 
0.06)), .Names = c("ID", "Year", "Species", "Treatment", "value"
), row.names = c(NA, -4L), class = "data.frame")
0 голосов
/ 11 октября 2018

Мы можем сгруппировать по «Году», а затем сделать разницу между столбцом «значение» и «значением», которое соответствует «Обработка» как «контроль»

library(dplyr)
df1 %>%
   group_by(Year) %>%
   mutate(difference = value - value[Treatment == "control"])
# A tibble: 4 x 6
# Groups:   Year [2]
#     ID  Year Species Treatment value difference
#  <int> <int> <chr>   <chr>     <dbl>      <dbl>
#1     1  2010 x       control    0.04       0   
#2     1  2011 x       control    0.1        0   
#3     2  2010 x       MaxDamage  0.02      -0.02
#4     2  2011 x       MaxDamage  0.06      -0.04

Еслипорядок появления «контроля» такой же, как если бы каждый «год» имел две «обработки», тогда вместо группировки мы можем поднастроить «значение» и затем сделать разницу напрямую

df1 %>%
    mutate(difference = value - rep(value[Treatment == "control"], ceiling(n()/2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...