【问题标题】:get id's of multiple rows in one cell in r data.table获取r data.table中一个单元格中多行的ID
【发布时间】:2021-12-21 09:57:57
【问题描述】:

我有一个长格式的 data.table:

dt <- data.table(id=1:3, Q1=c(1,2,1), Q2=c(3,1,3), Q3=c("a","b","a"), Q4=c("d","c","d"))
dt
   id Q1 Q2 Q3 Q4
1:  1  1  3  a  d
2:  2  2  1  b  c
3:  3  1  3  a  d

如果我这样做

unique(dt[,Q1:Q4])
   Q1 Q2 Q3 Q4
1:  1  3  a  d
2:  2  1  b  c

我得到了唯一的行,但我丢失了 id 的信息。 我只想将它们保留在一行中,如下所示:

    id Q1 Q2 Q3 Q4
1: 1,3  1  3  a  d
2:   2  2  1  b  c

我怎样才能做到这一点?

谢谢

【问题讨论】:

    标签: r data.table unique long-format-data


    【解决方案1】:

    我建议为此设置一个列表列,以防您想再次拥有不同的 ids。这与 Wimpel 的回答并没有太大的不同,它只是将 paste 替换为 list,但它的概念已经足够不同了:

    dt2 <- dt[, .(id = list(id)), by = .(Q1, Q2, Q3, Q4)]
    dt2
    #       Q1    Q2     Q3     Q4     id
    #    <num> <num> <char> <char> <list>
    # 1:     1     3      a      d    1,3
    # 2:     2     1      b      c      2
    

    有了这个,如果你需要寻找“会员”,你仍然可以使用%in%(尽管你需要lapply或类似的):

    dt2[ sapply(id, `%in%`, x = 1), ]
    #       Q1    Q2     Q3     Q4     id
    #    <num> <num> <char> <char> <list>
    # 1:     1     3      a      d    1,3
    

    否则,如果您使用 toStringpaste 之类的内容,则需要使用正则表达式来尝试查找成员资格。

    【讨论】:

    • 感谢@r2evans!我接受了@Wimpel 的回答,因为它很容易解决我的问题,但很高兴在这里了解列表的潜力。
    【解决方案2】:
    dt[, .(id = paste0(id, collapse = ";")), by = .(Q1, Q2, Q3, Q4)]
    #    Q1 Q2 Q3 Q4  id
    # 1:  1  3  a  d 1;3
    # 2:  2  1  b  c   2
    

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      相关资源
      最近更新 更多