Как вставить / объединить несколько извлеченных подмножеств в набор данных на основе одинаковых имен в строках - PullRequest
0 голосов
/ 18 января 2019

Я хочу извлечь строки с end.time не NA, и объединить это подмножество с исходным набором данных. Имея только один идентификатор, я довольно легко знаю, как это сделать, как пример моего макияжа и код ниже:

  Data <-         ID         start.time  end.time   EVENT 
             1   aaa           NA         21:00     1
             2   aaa           NA         17:00     1
             3   aaa          13:00        NA       2


 Subs1<-subset(Data, (!is.na(Data[,3])) )
 bind1=rbind(Data,Subs1) 

Однако, если существует несколько идентификаторов ... Я не могу просто использовать rbind для их связывания, я изучил функцию вставки, но хочу вставить подмножество непосредственно после того же идентификатора

Например,

Data2  <-         ID         start.time  end.time   EVENT 
             1   aaa           NA         21:00     1
             2   aaa           NA         17:00     1
             3   aaa          13:00        NA       2
             4   bbb          12:00       15:00     2
             5   bbb           NA         23:00     3
             6   ccc          09:00        NA       4

Мой желаемый результат должен быть таким, как показано ниже,

NewData2  <-         ID         start.time  end.time   EVENT 
                 1   aaa           NA         21:00     1
                 2   aaa           NA         17:00     1
                 3   aaa          13:00        NA       2
                 4   aaa           NA         21:00     1
                 5   aaa           NA         17:00     1
                 6   bbb          12:00       15:00     2
                 7   bbb           NA         23:00     3
                 6   bbb          12:00       15:00     2
                 7   bbb           NA         23:00     3
                 8   ccc          09:00        NA       4

Я оглянулся и не могу найти способ сделать это ... Буду признателен за любые предложения и помощь!

1 Ответ

0 голосов
/ 18 января 2019

В базе R мы можем сначала subset Data2 и rbind перевести его на исходный кадр данных, а затем использовать order, чтобы упорядочить его по ID

df <- rbind(Data2, subset(Data2, !is.na(end.time)))
df[order(df$ID), ]

#    ID start.time end.time EVENT
#1  aaa       <NA>    21:00     1
#2  aaa       <NA>    17:00     1
#3  aaa      13:00     <NA>     2
#11 aaa       <NA>    21:00     1
#21 aaa       <NA>    17:00     1
#4  bbb      12:00    15:00     2
#5  bbb       <NA>    23:00     3
#41 bbb      12:00    15:00     2
#51 bbb       <NA>    23:00     3
#6  ccc      09:00     <NA>     4

С dplyr вы можете filter не-NA end.time и использовать bind_rows, чтобы добавить их в исходный кадр данных, а затем arrange на ID

library(dplyr)

Data2 %>%
  filter(!is.na(end.time)) %>%
  bind_rows(Data2) %>%
  arrange(ID)

#    ID start.time end.time EVENT
#1  aaa       <NA>    21:00     1
#2  aaa       <NA>    17:00     1
#3  aaa       <NA>    21:00     1
#4  aaa       <NA>    17:00     1
#5  aaa      13:00     <NA>     2
#6  bbb      12:00    15:00     2
#7  bbb       <NA>    23:00     3
#8  bbb      12:00    15:00     2
#9  bbb       <NA>    23:00     3
#10 ccc      09:00     <NA>     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...