我是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列...