我有一个在绘图中绘制的大数据表,用户可以使用区域(矩形或多边形)在散点图中选择点。处理完这个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
答案 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]