Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 列表覆盖范围的最小数目_R_List - Fatal编程技术网

R 列表覆盖范围的最小数目

R 列表覆盖范围的最小数目,r,list,R,List,我有以下资料: dist<-c('att1','att2','att3','att4','att5','att6') p1<-c('att1','att5','att2') p2<-c('att5','att1','att4') p3<-c('att3','att4','att2') p4<-c('att1','att2','att3') p5<-c('att6') dist这是我尝试的解决方案。我已经尽我所能去矢量化/矩阵化,希望它足够快。注释中解释了每个

我有以下资料:

dist<-c('att1','att2','att3','att4','att5','att6')
p1<-c('att1','att5','att2')
p2<-c('att5','att1','att4')
p3<-c('att3','att4','att2')
p4<-c('att1','att2','att3')
p5<-c('att6')

dist这是我尝试的解决方案。我已经尽我所能去矢量化/矩阵化,希望它足够快。注释中解释了每个步骤

library(qdapTools)
library(dplyr)
library(data.table)
## generate matrix of attributes
grid_matrix <- do.call(CJ, rep(list(1:0), 5))  %>% as.matrix
attribute_matrix
##   att1 att2 att3 att4 att5 att6
## 1    1    1    0    0    1    0
## 2    1    0    0    1    1    0
## 3    0    1    1    1    0    0
## 4    1    1    1    0    0    0
## 5    0    0    0    0    0    1

## create a grid of combination of matrix
grid_matrix <- do.call(CJ, rep(list(1:0), 5))  %>% as.matrix
colnames(grid_matrix) <- paste0("p", 1:5)

## check whether each combination has all attribute presented
combin_all_element_present <- rowSums(grid_matrix %*% attribute_matrix > 0) %>% 
  `==`(., ncol(attribute_matrix))

combin_all_element_present
##  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

## generate a submatrix which satisfy the condition
grid_matrix_sub <- grid_matrix[combin_all_element_present, ]
## find the combinations with minumun number of p
grid_matrix_sub[rowSums(grid_matrix_sub) == min(rowSums(grid_matrix_sub)), ]
##      p1 p2 p3 p4 p5
## [1,]  0  1  0  1  1
## [2,]  0  1  1  0  1
## [3,]  1  0  1  0  1

为什么只有p1、p3、p5?
p2、p3、p5也一样吗?谢谢@Sotos,你说得对。在这种情况下,由于p1和p2具有相同数量的属性,因此也可以作为解决方案。对我来说,一个解决方案足够好(我不必得到所有的解决方案),只需要满足约束条件的第一个解决方案。谢谢,我得到了以下错误:>attribute_matrix%+unlist%>%tokens%>%dfm%>%as.validObject(.Object)中的矩阵错误:无效类“dfmSparse”对象:超类“replValueSp”未在对象的classHmm环境中定义。它应该是
quanteda
的版本问题。你的版本是什么?我会考虑看我的更新。我不太熟悉
qdapTools
,但输出是一样的。是的。这是正确的。您可以从结果矩阵中选择任意一行。
library(quanteda)
attribute_matrix <- lapply(list(p1, p2, p3, p4, p5), function(x) paste(x, collapse = ' ')) %>% 
  unlist %>% tokens %>% dfm %>% as.matrix
attribute_matrix
##        features
## docs    att1 att5 att2 att4 att3 att6
##   text1    1    1    1    0    0    0
##   text2    1    1    0    1    0    0
##   text3    0    0    1    1    1    0
##   text4    1    0    1    0    1    0
##   text5    0    0    0    0    0    1