R: на основе последовательных значений в двух строках, заполнить третью - PullRequest
0 голосов
/ 08 июня 2018

У меня такое ощущение, что есть dplyr решение для этого, но я не совсем могу туда добраться.

У меня есть фрейм данных:

Name     Job     ID1     ID2
Name1    Job1    ID1a    ID2a
                 ID1a    ID2a
Name2    Job2    ID1b    ID2b
Name3    Job3    ID1c    ID2c

Всякий раз, когда есть повторениеиз значений столбцов ID1 и ID2 я хочу вставить строку под названием «wait».Таким образом, окончательный фрейм данных должен выглядеть так:

Name     Job     ID1     ID2
Name1    Job1    ID1a    ID2a
         wait    ID1a    ID2a
Name2    Job2    ID1b    ID2b
Name3    Job3    ID1c    ID2c

В моем фрейме данных десятки тысяч строк.Эти повторяющиеся идентификаторы встречаются довольно часто.Я хочу вставить одну и ту же строку ожидания каждый раз, когда ID1 и ID2 повторяются во второй раз.Как я могу сделать это в R?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вот вариант с использованием data.table

library(data.table)
setDT(df)[df[, .I[seq_len(.N) > 1], .(rleid(ID1, ID2))]$V1, Job := 'wait']
df
#    Name  Job  ID1  ID2
#1: Name1 Job1 ID1a ID2a
#2:  <NA> wait ID1a ID2a
#3: Name2 Job2 ID1b ID2b
#4: Name3 Job3 ID1c ID2c
0 голосов
/ 08 июня 2018

Данные

df <- read.table(text="Name     Job     ID1     ID2
Name1    Job1    ID1a    ID2a
NA       NA      ID1a    ID2a
Name2    Job2    ID1b    ID2b
Name3    Job3    ID1c    ID2c", header=TRUE)

Вы можете использовать data.table::rleid для группировки последовательных дублированных значений идентификаторов

library(dplyr)
ans <- 
  df %>%
    group_by(G = data.table::rleid(paste(ID1, ID2))) %>%
    mutate(Job = c(head(Job, 1), rep("wait", times=n()-1))) %>%
    ungroup %>%
    select(-G)
ans

   # Name  Job  ID1  ID2
# 1 Name1    1 ID1a ID2a
# 2  <NA> wait ID1a ID2a
# 3 Name2    2 ID1b ID2b
# 4 Name3    3 ID1c ID2c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...