R-如何获取数据框中所有随机选择的两个列的总和共享值



我是R的新手,所以请原谅我。我什至不知道如何问这个问题...这个问题的目的是找出最共享的两个或三个因素。我有这样的数据框:

mydata<-read.table(header=TRUE, text="
                   A B C D
                   peak_1 peak_1 0 0
                   peak_2 0 0 peak_2
                   0 0 peak_3 peak_3
                   peak_4 0 0 peak_4
                   peak_6 0 0 0
                   peak_7 0 peak_7 0
                   peak_8 peak_8 peak_8 peak_8")

a,b,c和d是四个因素。希望该表可以很好地显示在您的R中。我想找出每两个列之间共享值的数量(但不是0)。我预计结果将如下显示:

myresuts<-read.table(header=TRUE, text = "
                     factor_1 factor_2 number_of_shared
                     A B 2
                     A C 2
                     A D 3
                     B C 1
                     B D 1
                     C D 2")

对于这张小桌子,我可以手动进行十字路口。但是实际上,我有一张很大的表,有100多列可以进行此类计算。我想知道如何编写一个函数来解决这个问题。另外,如果我想弄清每三列中共享值的总和(希望可以以相同的方式解决)。

谢谢!

可以在gtools库中找到计算组合和排列的有用功能。

library(gtools)
cbn <- data.frame(combinations(ncol(mydata),2,names(mydata)))
cbn$num_shared = apply(cbn, 1, function(i) sum(mydata[,i[1]] == mydata[,i[2]]))
cbn
X1 X2 num_shared
1  A  B          2
2  A  C          3
3  A  D          4
4  B  C          4
5  B  D          3
6  C  D          4

如果您不想比较零,请使用mydata[mydata == 0] <- NA将其转换为NA,然后将na.rm = T放置在总和内。

您所需的结果表明您不想在比较中计算零值。我是通过将零转换为na的(我也转换为字符,所以我们可以用非重叠值比较列)。

)。
mydata <- lapply(mydata,
                 function(x) {
                    x[x==0] <- NA
                    as.character(x)
})
cc <- combn(names(mydata),2,
      FUN=function(x) {
         data.frame(matrix(x,nrow=1),
                    val=sum(mydata[[x[1]]]==mydata[[x[2]]],na.rm=TRUE))
      },
      simplify=FALSE)
do.call(rbind,cc)

如果适当地更改功能中的条件,这应该适用于3列...

相关内容

  • 没有找到相关文章

最新更新