Создание новой переменной из значений в существующих строках и столбцах - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел бы создать новую переменную с меткой change_index.Эта переменная - результат 1 в момент 3 - результат 1 в момент 1 / результат 1 в момент 1.

Как мне поступить?Я попытался сделать следующее

outcome1t0 <- data %>%
filter(time == "1") %>%
select(outcome1)

outcome1t12 <- data %>%
filter(time == "3") %>%
select(outcome1)

data$newvariable <- (outcome1t0 - outcome1t12) / outcome1t0

, но получаю следующую ошибку

Error in `$<-.data.frame`(`*tmp*`, bicind, value = list(bicep = c(13.3591525423729,  : 
replacement has 20 rows, data has 60

Я понимаю, что это происходит потому, что новый фрейм данных меньше, так как он содержит меньше строк.Должен ли я просто создать новый фрейм данных с индексом изменений?Как мне это сделать?

Я должен рассчитать этот индекс изменений для многих переменных в столбцах (много результатов).Есть ли способ автоматизировать этот процесс?

Спасибо за чтение.

   subject treatment time outcome1 outcome2
1       1         a    1       80       15
2       1         a    2       75       14
3       1         a    3       74       12
4       2         b    1       90       16
5       2         b    2       81       15
6       2         b    3       76       15

РЕДАКТИРОВАТЬ 1

Попытавшись сделать следующее, как предложено ниже, я изменил имена в соответствии с моими данными

ancestral1 %>%
group_by(subject) %>% 
mutate(bicep0 = bicep[time == 0],
     bicep12 = bicep[time == 12], 
     bicepind = (bicep12 - bicep0) / bicep12)

Я получаю следующую ошибку

Error in mutate_impl(.data, dots) : 
Column `bicep0` must be length 1 (the group size), not 0

РЕДАКТИРОВАТЬ 2

Попробовал новое предложение, все та же ошибка

ancestral1 %>% 
group_by(subject) %>% 
mutate(bicep0 = if(any(time == 5)) bicep[time == 5] else NA, 
     bicep12 = bicep[time == 3], 
     bicepind = (bicep0 - bicep12) / bicep0)

Error in mutate_impl(.data, dots) : 
Column `bicep12` must be length 1 (the group size), not 0

1 Ответ

0 голосов
/ 21 сентября 2018

Вместо того, чтобы делать filter, мы создаем новые переменные

data %>%
  group_by(subject) %>% 
  mutate(outcome1t0 = outcome1[time == 1],
       outcome1t2 = outcome1[time == 3], 
       newvariable = (outcome1t0 - outcome1t2) / outcome1t0) %>%
  select(-outcome1t0, -outcome1t2)
# A tibble: 6 x 6
# Groups:   subject [2]
#  subject treatment  time outcome1 outcome2 newvariable
#    <int> <chr>     <int>    <int>    <int>       <dbl>
#1       1 a             1       80       15       0.075
#2       1 a             2       75       14       0.075
#3       1 a             3       74       12       0.075
#4       2 b             1       90       16       0.156
#5       2 b             2       81       15       0.156
#6       2 b             3       76       15       0.156
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...