Я пытаюсь извлечь уникальные наборы строк во вложенном фрейме данных.
Начальный фрейм данных показан ниже:
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
, однако они используются для сравнения двух фреймов данных.