我正在尝试将列乘以并得到它的名字。 我有一个数据框:
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
这个是我在尝试?
答案 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