-7

我正在尝试将列相乘并获取其名称。我有一个数据框:

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

这是我正在尝试的吗?

4

1 回答 1

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
于 2013-11-29T19:21:44.597 回答