如何在嵌套数据框中获取唯一的行集?

时间:2018-05-23 17:23:06

标签: r list dataframe type-conversion tidyverse

我试图在嵌套数据框中提取唯一的行集。

初始数据框如下所示:

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:家庭ID
  • mid:家庭成员ID
  • 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已被删除(删除与其他家庭完全相同的家庭活动
  • hidmid被序号替换(家庭和会员的唯一ID没有任何意义)

第一点和第三点可以解决,然而,第二点无法完成,因为仅通过应用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,因为会员ID不再重要

是否要从嵌套列表(或先前显示为[[3]]的常规数据框格式)中删除[[1]]中具有相同数据框的df.unique

由于实际的dara框架包含超过60,000个家庭,我需要一种不是手动实现它的方法,例如df.nest[1:2,]。其他不使用嵌套数据框架的解决方案也很受欢迎。

我找到了名为all_equal/all.equalidentical的函数,但这些函数用于比较两个数据框。

1 个答案:

答案 0 :(得分:-2)

复制的函数可以删除重复的行。 例: df [!duplicated(df [c(“hid”,“mid”,“tmid”,“thid”,“tdid”,“tiid”)]),]