让我们说我有(r1,... rm)行的矩阵和(c1,c2,... cn)所有元素都是0' s和1' s。 / p>
我想计算不同组合的总数0和1:例如,c1& c2,!c1& c3,c1& c3,c1& c2& c3,c1& c3& c4。
有没有一种有效的方法来计算这些?
我这样做很差,数据就是我的矩阵。
is.one <- function(data,zero.one)
{
#zero.one is logical , T, counting 1, otherwise 0s.
if (zero.one)
return (data==1)
else
return (data==0)
}
sum.one <- function(data, comb, zero.one)
{
#comb is one of the combinations as a vector
index<- rep(T,nrow(data))
for (i in 1: length(comb))
{
# assuming i-th column is the i-th element of combination
index <- is.one(data[,i], zero.one[i])
data <- data[index,]
}
return(sum(index))
}
示例:
sum.one (data, c("c1","c2"), c(1,1))
sum.one (data, c("c1","c2","c3"), c(1,1,1))
sum.one (data, c("c1","c2","c3"), c(1,1,0))
我不想为它们出现的每个组合计算c1或c2,并且当m(nrow(data))很大时保持索引可能是一个内存问题。
任何建议都将受到赞赏。
答案 0 :(得分:0)
我的想法是使用reshape2
df <- as.data.frame(your_matrix)
然后,您可以轻松地总结列并将其保存在另一个变量
中df <- data.frame(
c1 = sample(c(0, 1), replace = TRUE, size = 100),
c2 = sample(c(0, 1), replace = TRUE, size = 100),
c3 = sample(c(0, 1), replace = TRUE, size = 100),
c4 = sample(c(0, 1), replace = TRUE, size = 100)
)
ones <- as.numeric(colSums(df))
zeros <- as.numeric(NROW(df) - ones)
> ones
c1 c2 c3 c4
39 45 41 50
> zeros
c1 c2 c3 c4
61 55 59 50
然后,您可以将这些向量用于您的组合。例如:第2列中有多少个,第4列中有多少个?
> answer <- as.numeric(ones[2] + zeros[4])
> answer
[1] 95
答案 1 :(得分:0)
data <- matrix(c(1, 0, 0, 0, 0, 0, 1, 0, 1), 3, 3)
rownames(data) <- paste0("r", 1:nrow(data))
colnames(data) <- paste0("c", 1:ncol(data))
data
# c1 c2 c3
# r1 1 0 1
# r2 0 0 0
# r3 0 0 1
您可以创建包含所有结果的多维对象,然后选择所需的值:
x <- colSums(data)
y <- colSums(data==0)
names(y) <- paste0(names(y), "_0")
o1 <- outer(x, y, FUN = "+")
o1
# c1_0 c2_0 c3_0
# c1 3 4 2
# c2 2 3 1
# c3 4 5 3
o2 <- outer(o1, y, FUN = "+")
o2
# , , c1_0
#
# c1_0 c2_0 c3_0
# c1 5 6 4
# c2 4 5 3
# c3 6 7 5
#
# , , c2_0
#
# c1_0 c2_0 c3_0
# c1 6 7 5
# c2 5 6 4
# c3 7 8 6
#
# , , c3_0
#
# c1_0 c2_0 c3_0
# c1 4 5 3
# c2 3 4 2
# c3 5 6 4
o2[1, 1, 2]
# [1] 6