乘以多列并为多个值找到每列的总和 [英] multiply multiple column and find sum of each column for multiple values
问题描述
我正在尝试乘以列并获取其名称.我有一个数据框:
I'm trying to multiply column and get its names. I have a data frame:
v1 v2 v3 v4 v5
0 1 1 1 1
0 1 1 0 1
1 0 1 1 0
我正在尝试将每一列与其他列相乘,例如:
I'm trying to multiplying each column with other, like:
v1v2
v1v3
v1v4
v1v5
和v2v3v2v4v2v5
and v2v3 v2v4 v2v5
等等,和
v1v2v3
v1v2v4
v1v2v5
v2v3v4
v2v3v5
4 组合和 5 组合...如果有 n 列则 n 组合.
4 combination and 5 combination...if there is n column then n combination.
我尝试在 while 循环中使用以下代码,但它不起作用:
I'm try to use following code in while loop, but it is not working:
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
我正在尝试这个?
推荐答案
试试这个:
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个组合",选择列表的第一个元素,访问第三个组合",选择列表的第二个元素,依此类推
Edit following comment The results of the different set of column combinations can then be accessed by indexing (subsetting) the list. E.g. to access the "2 combinations", select the first element of the list, to access the "3rd combination", select the second element of the list, et c.
ll[[1]]
# V1V2 V1V3 V1V4 V1V5 V2V3 V2V4 V2V5 V3V4 V3V5 V4V5
# 0 1 1 0 2 1 2 2 2 1
这篇关于乘以多列并为多个值找到每列的总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!