使用条件的数据表子集,以及仅来自该子集

时间:2018-03-08 07:04:59

标签: r data.table subset

我有一个在绘图中绘制的大数据表,用户可以使用区域(矩形或多边形)在散点图中选择点。处理完这个select元素后,我得到一个包含' cluster'的列表的数据帧。选择中的每个点属于哪个&哪个'该集群的元素(行),即

cluster    elementNr    
1             1    
1             23    
2             7
2             9
2             14

这会重新创建输出:

selectme <- data.frame(cluster = c(rep(1,20), rep(2,30)), elementNr = c(sample(1:100, 20, replace = F),sample(1:100,30, replace =F)))

这会创建我的主数据表的虚拟等价物

mydata <- data.table(cluster = sample(c(1:5), 5000, replace = T), val1 = runif(5000, 0.1, 100), val2 = runif(5000, 0.1, 50))

我想弄清楚的是,如何使用selectme数据框对数据表进行子集化,以便从中获取正确的粒子。 也就是说,作为第一个例子,我应该得到cluster == 1的行的第1行和第23行,以及cluster == 2

的第7行,第9行,第14行

预期产出:

Cluster   val1    val2
 1        0.45    2.54     (1st of this cluster 
 1        25.73   84.83  (23rd element of this cluster 
 2        0.26    12.76   (7th el)
 2        3.16    26.84   (9th el)
 2        0.76    19.46   (14th el)
  • 值只是示例,因为测试代码随机创建它们

所以第7个元素不是mydata的第7行,而是cluster == 2的子集的第7行  因为我的数据可以包含几十个集群,所以我想将以下逻辑句子放入代码中: &#34;对于selectme中的每个集群,找到mydata子集的行,其中cluster等于同一个集群,并获取与当前集群的selectme的elementnrs相等的行,并生成一个包含所有相应行的输出&#34 ;

如果需要,我可以先将myselection转移到data.table

更新:添加了实际数据

RDS格式的真实数据文件,真实选择文件和预期输出文件可在此处找到: datafiles

2 个答案:

答案 0 :(得分:2)

使用您提供的数据:

mydata <- data.table(cluster = sample(c(1:5), 5000, replace = T), 
                     val1 = runif(5000, 0.1, 100), 
                     val2 = runif(5000, 0.1, 50))

selectme <- data.frame(cluster = c(rep(1,20), rep(2,30)), 
                       elementNr = c(sample(1:100, 20, replace = F),
                       sample(1:100,30, replace =F)))

# One at a time:
mydata[cluster == 1][selectme[selectme$cluster == 1,]$elementNr]
#    cluster       val1      val2
# 1:       1 92.7082853 34.879758
# 2:       1  6.2921762 19.203557
# 3:       1 32.5258127  3.731329
# 4:       1 93.5793112 34.937362
# 5:       1 62.0401740 42.491657
# and so on...

# Programmatically

clusters <- unique(selectme$cluster)
tobind <- vector("list", length(clusters))
for (i in seq_along(tobind)){
  tobind[[i]] <- mydata[cluster == clusters[i]][selectme[selectme$cluster == clusters[i],]$elementNr]
}

selected <- rbindlist(tobind)

答案 1 :(得分:0)

为每行创建索引后,可以使用data.table进行内部联接,如下所示

set.seed(8L)
selectme <- data.table(cluster = c(rep(1L,20), rep(2L,30)), elementNr = c(sample(1:100, 20, replace = F),sample(1:100,30, replace =F)))
mydata <- data.table(cluster = sample(c(1:5), 5000, replace = T), val1 = runif(5000, 0.1, 100), val2 = runif(5000, 0.1, 50))

selectme[mydata[, rn := .I, by=.(cluster)],
    on=c("cluster", "elementNr"="rn"), nomatch=0L]