我有一个如下所示的 data.frame:
> DF1
A B C D E
a x c h p
c d q t w
s e r p a
w l t s i
p i y a f
我想将我的 data.frame 的每一列与其余列进行比较,以计算公共(public)元素的数量。例如,我想将 A 列与所有剩余列(B、C、D、E)进行比较,并以这种方式计算共同实体:
A 与其余:
然后相同:B 与 C、D、E 列等。
我该如何实现?
最佳答案
我们可以遍历列名并与其他列进行比较,方法是取 intersect
并获取 length
sapply(names(DF1), function(x) {
x1 <- lengths(Map(intersect, DF1[setdiff(names(DF1), x)], DF1[x]))
c(x1, setNames(0, setdiff(names(DF1), names(x1))))[names(DF1)]})
# A B C D E
#A 0 0 1 3 3
#B 0 0 0 0 1
#C 1 0 0 1 0
#D 3 0 1 0 2
#E 3 1 0 2 0
或者这可以通过在获取长格式(melt
)数据集的频率后取叉积来更紧凑地完成
library(reshape2)
tcrossprod(table(melt(as.matrix(DF1))[-1])) * !diag(5)
# Var2
#Var2 A B C D E
# A 0 0 1 3 3
# B 0 0 0 0 1
# C 1 0 0 1 0
# D 3 0 1 0 2
# E 3 1 0 2 0
注意:crossprod
部分也是用 RcppEigen
实现的 here这会让这个更快
https://stackoverflow.com/questions/43658982/
相关文章:
regex - 正则表达式 : convert a list of name and value p
docker - 在 alpine 容器中使用 confluent-kafka python 客户端
sql - 为什么我需要在重命名之前将数据库设置为 single_user?
java - 找不到属性 : Error in spring boot 的设置方法
pymc3 - BetaBinomial 和 "Beta and Binomial"之间的区别
atom-editor - 原子氢 : How is "run cell" used?