将多列相乘并找到多个值的每列的总和

时间:2013-11-29 16:33:18

标签: r dataframe apply tapply

我正在尝试将列乘以并得到它的名字。 我有一个数据框:

v1 v2 v3 v4 v5  
 0  1  1  1  1
 0  1  1  0  1
 1  0  1  1  0

我正在尝试将每列与其他列相乘,例如:

v1v2 
v1v3
v1v4
v1v5

和     V2V3     v2v4     v2v5

等,

v1v2v3 
v1v2v4
v1v2v5
v2v3v4
v2v3v5

4种组合和5种组合......如果有n列则为n组合。

我尝试在while循环中使用以下代码,但它不起作用:

i<-1 
while(i<=ncol(data)
{  
  results<-data.frame() 
  v<-i
  results<- t(apply(data,1,function(x) combn(x,v,prod))) 
  comb <- combn(colnames(data),v)
  colnames(results) <- apply(comb,v,function(x) paste(x[1],x[2],sep="*"))
  results <- colSums(results)
}

但它不起作用。

样品输出..

如果n = 3

v1v2  v1v3 v2v3
  0      0    1    
  0      0    1  
  0      1    0

和colsum

v1v2  v1v3 v2v3
   0     1    2

然后

v1v2=0
v1v3=1
v2v3=2

这个是我在尝试?

1 个答案:

答案 0 :(得分:2)

试试这个:

df <- read.table(text = "v1 v2 v3 v4 v5  
 0  1  1  1  1
 0  1  1  0  1
 1  0  1  1  0", skip = 1)

df

ll <- vector(mode = "list", length = ncol(df)-1)

ll <- lapply(2:ncol(df), function(ncols){
  tmp <- t(apply(df, 1, function(rows) combn(x = rows, m = ncols, prod)))
  if(ncols < ncol(df)){
  tmp <- colSums(tmp)
  }
  else{
    tmp <- sum(tmp)
  }
  names1 <- t(combn(x = colnames(df), m = ncols))
  names(tmp) <- apply(names1, 1, function(rows) paste0(rows, collapse = ""))
  ll[[ncols]] <- tmp
})

ll

# [[1]]
# V1V2 V1V3 V1V4 V1V5 V2V3 V2V4 V2V5 V3V4 V3V5 V4V5 
#    0    1    1    0    2    1    2    2    2    1 
# 
# [[2]]
# V1V2V3 V1V2V4 V1V2V5 V1V3V4 V1V3V5 V1V4V5 V2V3V4 V2V3V5 V2V4V5 V3V4V5 
#      0      0      0      1      0      0      1      2      1      1 
# 
# [[3]]
# V1V2V3V4 V1V2V3V5 V1V2V4V5 V1V3V4V5 V2V3V4V5 
#        0        0        0        0        1 
# 
# [[4]]
# V1V2V3V4V5 
#          0

修改以下评论 然后可以通过索引(子集化)列表来访问不同组列组合的结果。例如。要访问“2个组合”,请选择列表的第一个元素,访问“第3个组合”,选择列表的第二个元素,等等。

ll[[1]]
# V1V2 V1V3 V1V4 V1V5 V2V3 V2V4 V2V5 V3V4 V3V5 V4V5 
#    0    1    1    0    2    1    2    2    2    1