Если появляется 1, все последующие элементы переменной должны быть равны 1, сгруппированы по теме

#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