Как получить уникальный набор строк во вложенном фрейме данных? - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь извлечь уникальные наборы строк во вложенном фрейме данных.

Начальный фрейм данных показан ниже:

df <- data.frame(
    hid=c(1,1,1,1,2,2,2,2,2,3,3,3,3),
    mid=c(1,2,3,4,1,2,3,4,5,1,2,3,4),
    tmid=c("010","01010","010","01020",
           "010","0120","010","010","020",
           "010","01010","010","01020"),
    thid=c("010","02020","010","02020",
           "000","0120","010","010","010",
           "010","02020","010","02020"),
    tdid=c("000","01010","010","02020",
           "000","0100","010","010","010",
           "000","01010","010","02020"),
    tiid=c("010","02020","010","01020",
           "020","0220","020","020","020",
           "010","02020","010","01020")
    )

Отпечатано в кадре dara:

> df
   hid mid  tmid  thid  tdid  tiid
1    1   1   010   010   000   010
2    1   2 01010 02020 01010 02020
3    1   3   010   010   010   010
4    1   4 01020 02020 02020 01020
5    2   1   010   000   000   020
6    2   2  0120  0120  0100  0220
7    2   3   010   010   010   020
8    2   4   010   010   010   020
9    2   5   020   010   010   020
10   3   1   010   010   000   010
11   3   2 01010 02020 01010 02020
12   3   3   010   010   010   010
13   3   4 01020 02020 02020 01020

Этот фрейм данных состоит из следующих полей:

  • hid: идентификатор домохозяйства
  • mid: идентификатор члена домохозяйства
  • tmid, thid, tdid, tiid:переменные, указывающие цепочку активности каждого члена домохозяйства по-разному, например, 0 (пребывание дома) -1 (занятие вне дома) -0 (пребывание дома)

Теперь мне нужно извлечь уникальныйнабор действий членов, предпринятых домашними хозяйствами.Я не только извлекаю уникальные строки в каждом домашнем хозяйстве, но и должен извлекать сами наборы.Таким образом, df %>% distinct(hid,tmid,tdid,tiid) не будет работать для выделения отдельного набора видов деятельности, а df %>% distinct(hid,tmid,tdid,tiid) не может принимать во внимание набор действий в каждом домохозяйстве.Желаемый результат показан ниже:

> df.unique
   shid smid tmid  thid  tdid  tiid
1   1    1   010   010   000   010
2   1    2   010   010   010   010
3   1    3 01010 02020 01010 02020
4   1    4 01020 02020 02020 01020
5   2    1   010   000   000   020
6   2    2   010   010   010   020
7   2    3   020   010   010   020
8   2    4  0120  0120  0100  0220

Разница между предыдущими фреймами данных:

  • Дублированные строки в hid==2 удалены ( удаляют дублированные строки в каждом домохозяйстве)
  • hid==3 исключено ( исключено домашнее хозяйство, которое выполняет тот же набор действий по сравнению с другими домашними хозяйствами )
  • hid и midзаменяются порядковым номером (уникальный идентификатор домохозяйства и члена не имеет никакого значения)

Первый и третий пункты могут быть решены, однако второй пункт не может быть выполнен в полном объеме, поскольку он неМожно реализовать это просто, применив distinct().

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

> df.nest <- df.unique %>% dplyr::select(-n) %>% group_by(hid) %>% nest()
> df.nest$data
[[1]]
# A tibble: 4 x 5
   smid   tmid   thid   tdid   tiid
  <int> <fctr> <fctr> <fctr> <fctr>
1     1    010    010    000    010
2     2    010    010    010    010
3     3  01010  02020  01010  02020
4     4  01020  02020  02020  01020

[[2]]
# A tibble: 4 x 5
   smid   tmid   thid   tdid   tiid
  <int> <fctr> <fctr> <fctr> <fctr>
1     1    010    000    000    020
2     2    010    010    010    020
3     3   0120   0120   0100   0220
4     4    020    010    010    020

[[3]]
# A tibble: 4 x 5
   smid   tmid   thid   tdid   tiid
  <int> <fctr> <fctr> <fctr> <fctr>
1     1    010    010    000    010
2     2    010    010    010    010
3     3  01010  02020  01010  02020
4     4  01020  02020  02020  01020

*sid был добавлен, чтобы заменить mid на последовательный номер, поскольку идентификатор члена больше не важен

Любая идея удалить[[3]], который имеет те же фреймы данных в [[1]] из вложенного списка (или общий формат фрейма данных, ранее показанный как df.unique)?

Поскольку реальный фрейм dara содержит более 60 000 домохозяйств, мне нужноспособ реализовать это не вручную, например df.nest[1:2,].Также приветствуется другое решение, которое не использует вложенный фрейм данных.

Я нашел функции с именами all_equal/all.equal и identical, однако они используются для сравнения двух фреймов данных.

1 Ответ

0 голосов
/ 23 мая 2018

Функция! Duplicated может удалять дублирующиеся строки.Пример: df [! Duplicated (df [c ("hid", "mid", "tmid", "thid", "tdid", "tiid")]),]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...