我有一个数据框,用一个id标识一组值:

library(data.table)

dt <- data.table(
  id = rep(c("a", "b", "c"), each = 2),
  value1 = c(1, 1, 1, 2, 1, 1),
  value2 = c(0, 3, 0, 3, 0, 3)
)
dt
#>    id value1 value2
#> 1:  a      1      0
#> 2:  a      1      3
#> 3:  b      1      0
#> 4:  b      2      3
#> 5:  c      1      0
#> 6:  c      1      3

如您所见,ids ac标识了相同的一组值.所以我想创建一个"模式id",它标识与IDac相关联的一组值(obs:一个id可能标识两行以上,为了简单起见,我只将它们限制为两行).

我确实设法用嵌套数据想出了一个解决方案.表1和表match():

dt <- dt[, .(data = list(.SD)), by = id]

unique_groups <- unique(dt$data)
dt[, pattern_id := match(data, unique_groups)]
dt[, data := NULL]

dt
#>    id pattern_id
#> 1:  a          1
#> 2:  b          2
#> 3:  c          1

这是一个技巧,但它并没有我希望的那么快.match().关于列表的效率,文档非常清楚:

列表匹配可能非常缓慢,最好避免,除非是在简单的情况下.

如您所见,我不需要最终结果中的实际模式数据,只需要一个将ID与模式ID关联的表.我觉得把数据嵌套起来,用它来匹配,然后再删除它有点浪费,但不确定是否有更好的方法.我一直在思考如何将每个数据帧转换成一个字符串,或者更好的是,如何完全避免嵌套,但我想不出比现在更好的方法.

我已经创建了一个更大的数据集,可以使用和测试不同的解决方案:

set.seed(0)
size <- 1000000
dt <- data.table(
  id = rep(1:(size / 2), each = 2),
  value1 = sample(1:10, size, replace = TRUE),
  value2 = sample(1:10, size, replace = TRUE)
)

推荐答案

已更新(删除加入):

这个方法复制了您的方法(即要求顺序和值相同)

unique(
  dt[, pattern:=.(paste0(c(value1,value2), collapse=",")), by=id][,.(id,pattern)]
)[,grp:=.GRP, by=pattern][,pattern:=NULL]

       id   grp
   <char> <int>
1:      a     1
2:      b     2
3:      c     1

优先解决方案:

dt[dt[, .(paste0(sort(c(value1,value2)), collapse=",")), by=id] %>% 
     .[,pattern:=.GRP, by=V1] %>% 
     .[,V1:=NULL], on=.(id)]

输出:

       id value1 value2 pattern
   <char>  <num>  <num>   <int>
1:      a      1      0       1
2:      a      1      3       1
3:      b      1      0       2
4:      b      2      3       2
5:      c      1      0       1
6:      c      1      3       1

R相关问答推荐

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

将Multilinetring合并到一个线串中,使用sf生成规则间隔的点

R的GG平行坐标图中的排序变量

如何使用shinyChatR包配置聊天机器人

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

Highcharter多次钻取不起作用,使用不同方法

自动变更列表

错误:非常长的R行中出现意外符号

如何在分组条形图中移动相关列?

使用rest从header(h2,h3,table)提取分层信息

LOF中的插图短文字幕

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

哪一行和行和 Select 特定行,但是考虑到Nas

如何根据数据帧中的值从该数据帧中提取值?

在列表中排列R数据框中的列顺序

R中Gamma回归模型均方误差的两种计算方法不一致

在gggraph中显示来自不同数据帧的单个值

从数据创建数字的命名列表.R中的框

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?