根据另一个表中符合R阈值的数据合并行

我有一个二进制数据集,需要通过组合满足特定条件的行来进行修改。我的代码将我带到实际修改数据集的最后一步,但是在这一点之后,我陷入了困境。目标是使用data.table软件包,因为数据集非常大。为了确定合并行的条件,我使用WGCNA计算了Jaccard相似度矩阵,然后将其融化并过滤以包含大于0.75阈值的比较。下一步是合并根据相似度过滤阈值后显示的行对,同时仍保留不满足阈值的行。

# Load required packages
require(data.table); require(WGCNA); require(reshape2)

# Initalize data.table,set seed
data <- data.table(record = LETTERS); set.seed(1)

# Populate data.table with random 0s and 1s
for (col in 1:25) {
  column_name <- paste0('column',col)
  sample_data <- sample(c(0,1),length(LETTERS),replace = TRUE)
  set(x = data,j = column_name,value = sample_data)

}

# Copy original table,convert table to data.frame for similarity calculation
d <- copy(data); setDF(data); rownames(data) <- LETTERS; data$record <- NULL

# Calculate jaccard similarity
adj <- WGCNA::adjacency(datExpr = t(data),type = 'distance',distOptions = "method = 'binary'")

# Melt adjacency matrix,remove values equaling 1
melted_adj <- as.data.table(reshape2::melt(adj))[value != 1]
# Remove reciprocal entries,don't need to do extra work for A-B and B-A
m <- as.data.table(unique(t(apply(melted_adj,1,sort))))
# Set new column order
setcolorder(m,c('V2','V3','V1')); m[,V1 := as.numeric(V1)]

# Filter for desired threshold
mods2merge <- m[V1 > 0.75]

这时,我从mods2merge中选择了一个示例条目,并从d中隔离了这些行。我能够完成此任务的方法是只计算列总和和目标条目大于0。对于d中的给定行对,如果某列不包含0,那么我不感兴趣为该对修改该列。因此,计算列总计并过滤那些大于0的列。下一步是修改这些列,并将0替换为1,基本上将合并的行取为并集。

# As an example,isolate an entry and produce desired merge
example_merge <- d[record %chin% mods2merge[1][,c(V2,V3)]]

# Calculate column sums,recreate as a data.table
totals <- data.table(cols = paste0('column',1:25),value = reshape2::melt(example_merge[,colSums(.SD),.SDcols = 2:26])$value)

# Remove values of 0,only interested in the union of column 1s for a given pair. Change to 1 for both records.
example_merge[,(totals[value > 0][,cols]) := 1]

现在,example_merge显示了新行的存在。对于该对应该包含1的列。但是,我需要将其合并为一行并在原始表中进行更新。如果一行(例如A)出现两次,并且需要与B和C合并,则并集(A,B,C之间所有具有1的列)将成为新行,替换A,B和C命名无关紧要,它可以是名为ABC的新行。

我也许可以编写一个for循环,然后一个一个地更新,但我宁愿不这样做。原始数据集包含〜3000行和〜4000列。我觉得这里有一个合并,联接,滚动或可以完成此任务的东西。预先感谢您的帮助。

whui0919 回答:根据另一个表中符合R阈值的数据合并行

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3163225.html

大家都在问