Управление фреймами данных, отметка ошибок и возврат нового набора данных в R - PullRequest
0 голосов
/ 09 июля 2020

У меня есть набор данных, в котором 2 регистратора (Джек и Джейн) записали время забега для 5 бегунов (каждый бегун имеет уникальный идентификационный номер). Я пытаюсь определить расхождения во времени гонки, зарегистрированные двумя регистраторами, и вернуть новый набор данных с помеченными строками и логическим значением True / False в столбце, содержащем ошибку.

mydata:

runner_id  recorder  run_time_one  run_time_two  run_time_three
        1   jack      2             2              1
        1   jane      2             2              1
        2   jack      1             3              2  
        2   jane      2             3              2
        3   jack      3             2              1
        3   jane      3             1              1 
        4   jack      2             3              3
        4   jane      2             3              2
        5   jack      2             1              1
        5   jane      2             1              1

Мне нужно вернуть новый набор данных следующим образом:


runner_id  run_time_one  run_time_two  run_time_three
        2     False           True             True
        3     True            False            True
        4     True            True             False

бегун 2 должен быть помечен для ошибки в столбце run_time_one бегун 3 должен быть помечен как ошибка в столбце run_time_two бегун 4 следует отметить ошибку в столбце run_time_three

1 Ответ

0 голосов
/ 12 июля 2020

Если у ваших данных есть свойство, что каждый бегун наблюдает один раз каждым рекордером, и ваш фрейм данных сортируется по runner_id (оба из которых верны в вашем примере), то вот возможный подход base R:

df <- data.frame(
  runner_id = rep(1:5, each = 2),
  recorder = rep(c("jack", "jane"), times = 5),
  run_time_one = c(2, 2, 1, 2, 3, 3, 2, 2, 2, 2),
  run_time_two = c(2, 2, 3, 3, 2, 1, 3, 3, 1, 1),
  run_time_three = c(1, 1, 2, 2, 1, 1, 3, 2, 1, 1)
) # recreate the data set

flags <- df[df$recorder == "jack", 3:5] != df[df$recorder == "jane", 3:5]
  # create data frame with binary indicator of disagreement between recorders
flags <- data.frame(runner_id = df[df$recorder == "jack", ]$runner_id, flags)
  # glue runner id back onto flags column
flags[rowSums(flags[2:4, ]) > 0, ]
  # display subset of data frame with any disagreements

Если это могло быть так, что Джейк и Джейн наблюдали разные наборы бегунов (например, Джек был единственным наблюдателем за бегуном 6), тогда, пожалуйста, дайте мне знать, что вместе с тем, как бы вы хотели эту ситуацию разрешено на выходе.

...