获取r data.table中一个单元格中多行的id

问题描述 投票:0回答:3

我有一个长格式的数据表:

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
3个回答
1
投票

我建议为此使用一个列表列,以防您想再次拥有不同的

id
。这与 Wimpel 的答案并没有太大不同,只是将
paste
替换为
list
,但它的不同足以让 concept 爆发:

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

否则,如果您使用

toString
paste
之类的内容,则需要使用正则表达式来尝试查找成员资格。


0
投票
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

0
投票

另一个简单的技术(对我有用)是做一个简单的表格! x<-table(df$id). You get more specific and extract only those ids that have >1 个条目,但进一步对 x 进行子集化 - x2<-subset(x, Freq>1)

© www.soinside.com 2019 - 2024. All rights reserved.