#r #dataframe #data-science #data-analysis
#r #фрейм данных #наука о данных #анализ данных
Вопрос:
Я хочу сделать из:
test <- data.frame(subject=c(rep(1,10),rep(2,10)),x=1:10,y=0:1)
Что-то вроде этого:
Как я уже писал в заголовке, когда появляется первый 1, все последующие значения «y» для данного «subject» должны измениться на 1, затем то же самое для следующего «subject»
Я пробовал что-то подобное:
test <- test%>%
group_nest(subject) %>%
mutate(XD = map(data,function(x){
ifelse(x$y[which(grepl(1, x$y))[1]:nrow(x)]==TRUE , 1,0)})) %>% unnest(cols = c(data,XD))
Это не сработало : (
Ответ №1:
Попробуйте это:
library(dplyr)
#Code
new <- test %>%
group_by(subject) %>%
mutate(y=ifelse(row_number()<min(which(y==1)),y,1))
Вывод:
# A tibble: 20 x 3
# Groups: subject [2]
subject x y
<dbl> <int> <dbl>
1 1 1 0
2 1 2 1
3 1 3 1
4 1 4 1
5 1 5 1
6 1 6 1
7 1 7 1
8 1 8 1
9 1 9 1
10 1 10 1
11 2 1 0
12 2 2 1
13 2 3 1
14 2 4 1
15 2 5 1
16 2 6 1
17 2 7 1
18 2 8 1
19 2 9 1
20 2 10 1
Комментарии:
1. @chrisAR Всегда рад вам помочь!
2. @chrisAR Оба они работают. По сути, он ищет позицию для первого 1, а затем сравнивает с номером строки. После этого заполнение завершено. Те значения, которые меньше min, сохранят исходное значение y, тогда как остальные будут равны единице. Надеюсь, это понятно для вас и полезно!
3. @chrisAR — значение индекса для первого
1
уже установлено1
равным , поэтому вы можете установить<=
или<
, и оно должно работать независимо.4. @chrisAR Не стесняйтесь повторно принять этот ответ, если это полезно для вас. С уважением!
5. Простите меня, но второй способ, хотя вы и были первым, показался мне проще, но теперь, когда я понял, как это работает, я возвращаю вам «Принять ответ»: D
Ответ №2:
Поскольку у вас, похоже, есть только 0 и 1, простым подходом было бы получить cum
max
улятивное значение через функцию cummax
:
library(dplyr)
test %>%
group_by(subject) %>%
mutate(y = cummax(y))
ответ @Duck значительно более надежен, если у вас есть диапазон значений, которые могут появляться до или после первого 1.
Комментарии:
1. Спасибо, это намного проще, чем я думал: D