У меня есть некоторые данные о выживании организма в зависимости от времени. Данные построены с использованием средних значений для многих повторов для каждой временной точки, что может привести к прямому временному шагу с увеличением выживаемости. Иногда это приводит к выживанию больше 1, что невозможно. Как я могу условно изменить значения больше 1 на значение, предшествующее ему в том же столбце?
Вот как выглядят данные:
>df
Generation Treatment time lx
1 0 1 0 1
2 0 1 2 1
3 0 1 4 0.970
4 0 1 6 0.952
5 0 1 8 0.924
6 0 1 10 0.913
7 0 1 12 0.895
8 0 1 14 0.729
9 0 2 0 1
10 0 2 2 1
Я попытался изменить интересующий столбец как таковой, который все еще дает значения выше 1:
df1 <- df %>%
group_by(Generation, Treatment) %>%
mutate(lx_diag = as.numeric(lx/lag(lx, default = first(lx)))) %>% #calculate running survival
mutate(lx_diag = if_else(lx_diag > 1.000000, lag(lx_diag), lx_diag)) #substitute values >1 with previous value
>df1
Generation Treatment time lx lx_diag
1 12 1 0 1 1
2 12 1 2 1 1
3 12 1 4 1 1
4 12 1 6 0.996 0.996
5 12 1 8 0.988 0.992
6 12 1 10 0.956 0.968
7 12 1 12 0.884 0.925
8 12 1 14 0.72 0.814
9 12 1 15 0.729 1.01
10 12 1 19 0.76 1.04
Я ожидаю, что результаты будут выглядеть примерно так:
>df1
Generation Treatment time lx lx_diag
1 12 1 0 1 1
2 12 1 2 1 1
3 12 1 4 1 1
4 12 1 6 0.996 0.996
5 12 1 8 0.988 0.992
6 12 1 10 0.956 0.968
7 12 1 12 0.884 0.925
8 12 1 14 0.72 0.814
9 12 1 15 0.729 0.814
10 12 1 19 0.76 0.814
Я знаю, что вы можете условно изменить значения на определенное значение (например, ifelse без других ), но я не нашел никаких решений, которые могли бы условно изменить значение в столбце на значение в предыдущий ряд. Любая помощь приветствуется.
РЕДАКТИРОВАТЬ: я понял, что mutate
и if_else
довольно эффективны, когда дело доходит до преобразования значений. Вместо замены значений в последовательности с первого на последнее, как я и ожидал, команды заменяют все значения одновременно. Таким образом, в ряду значений> 1 у вас останутся некоторые. Таким образом, если вы просто запустите команду:
SurvTot1$lx_diag <- if_else(SurvTot1$lx_diag > 1, lag(SurvTot1$lx_diag), SurvTot1$lx_diag)
снова, вы можете избавиться от значений> 1. Не самое элегантное решение, но оно работает.