R:data.table 比较行集

标签 r set data.table projection

我正在 R 中使用 data.tables。我有以下 data.table 编码一组具有坐标 A、B、C、D 的点,并索引编码该点所属的一组。

library(data.table)

      A B C D set
   1: 0 0 0 0   1
   2: 1 0 1 0   2
   3: 1 1 1 0   2
   4: 0 1 0 0   2
   5: 1 0 1 1   2
   6: 0 1 0 0   3
   7: 1 1 0 0   3
   8: 0 0 1 0   4
   9: 1 0 1 0   4
  10: 0 1 0 1   4
  11: 0 0 0 0   5
  12: 1 0 0 0   5
  13: 1 1 1 0   5
  14: 1 1 1 1   5

dt = setDT(structure(list(A = c(0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 
0L, 1L, 1L, 1L), B = c(0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 
0L, 0L, 1L, 1L), C = c(0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 
0L, 0L, 1L, 1L), D = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 1L), set = c(1L, 2L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 
4L, 5L, 5L, 5L, 5L)), .Names = c("A", "B", "C", "D", "set"), row.names = c(NA, 
-14L), class = "data.frame"))

我有另一个表编码,例如每组的概率。

   set       mass
1:   1 0.27809187
2:   2 0.02614841
3:   3 0.36890459
4:   4 0.28975265
5:   5 0.03710247

wt = setDT(structure(list(set = 1:5, mass = c(0.27809187, 0.02614841, 0.36890459, 
0.28975265, 0.03710247)), .Names = c("set", "mass"), row.names = c(NA, 
-5L), class = "data.frame"))

我想要一个程序来创建到子空间的投影,例如光盘。 (请注意,在这种情况下,原始点 1,4,6,7,11,12 重合,集合 1 和 3 在该子空间中以及集合 2 和 5 中相同。

unique(dt[,c("C","D", "set")])
>   C D set
 1: 0 0   1
 2: 1 0   2
 3: 0 0   2
 4: 1 1   2
 5: 0 0   3
 6: 1 0   4
 7: 0 1   4
 8: 0 0   5
 9: 1 0   5
10: 1 1   5

要识别相同的集合,只需保留唯一的集合并对相应的质量求和。 IE。在这种情况下:

>   C D set
 1: 0 0   1
 2: 1 0   2
 3: 0 0   2
 4: 1 1   2
 5: 1 0   4
 6: 0 1   4

   set       mass
1:   1 0.6469965 % set 1 + set 3
2:   2 0.06325088 % set 2 + set 5
3:   4 0.36890459

感谢您的想法。

最佳答案

与 Frank 的概念类似,我们可以将每个集合的二进制值映射为十进制值 x * 2 ^ ((length(x) - 1):0) 。同样,对于“C”和“D”,我们得到:

coords = c("C", "D")
d = data.frame(set = dt$set, 
           val = Reduce("+", Map("*", list(dt$C, dt$D), 2 ^ ((length(coords) - 1):0))))
d

然后,我们可以按照相同的想法对相同的集合进行分组:

tab = table(d$val, d$set) > 0L ## `table(d) > 0` to ignore the duplicates
gr = colSums(tab * (2 ^ ((nrow(tab) - 1):0)))
gr
# 1  2  3  4  5 
# 8 11  8  6 11

## another (pre-edit) alternative with unnecessary overhead
#gr = cutree(hclust(dist(table(d) > 0L)), h = 0)
#gr                        
#1 2 3 4 5 
#1 2 1 3 2

并基于该组进行聚合:

rowsum(wt$mass[match(names(gr), wt$set)], gr, reorder = FALSE)
#         [,1]
#8  0.64699646
#11 0.06325088
#6  0.28975265

关于R:data.table 比较行集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41165752/

相关文章:

r - 无法使用ggplot2在瀑布图中添加数据标签

Python 从集合中移除集合

api - 使用 API 访问公共(public)(部分程序)变量

r - 循环遍历 data.table 列并通过变量索引引用创建多个列

python - 从 Python 运行 R 脚本

r - 更改ggplot中点的颜色填充和形状

c# - 为什么具有相同元素的 HashSet 在调用 GetHashCode() 时返回不同的值?

r - 是否存在 `setorder` 的版本,其行为类似于 `setcolorder`

r - 根据日期计算数据表中的前几行

r - 在R中加载stata.dta文件并进行数据分析