我有一个类似于

 TheDF <- data.frame(VarA=rep(c(7, 8, 11, 14), 4), Var2=c(1,1,1,0, 0,2,2,0, 0,0,3,0, 0,0,4,4), 
                Var3=c(50, 50, 50, 50, 100, 100, 100, 100, 150, 150, 150, 150, 200, 200, 200, 200))
 TheDF <- TheDF %>%
    filter(Var2>0)

我需要一个解决方案, Select 行的组合,以便每个值Var1Var2只能 Select 一次.

结果将如下所示(在本例中只有一种解决方案)

 Var1      Var2
 7          1
 8          2
 11         3
 14         4

这是Var1Var2的任意数字.如果存在非唯一的解决方案,例如:

 TheDF2 <- data.frame(VarA=rep(c(7, 8, 11, 14), 5), Var2=c(1,1,1,0, 0,2,2,0, 0,0,3,0, 0,0,4,4, 0,0,5,5), 
                Var3=c(50, 50, 50, 50, 100, 100, 100, 100, 150, 150, 150, 150, 200, 200, 200, 200, 250, 250, 250, 250))
TheDF2 <- TheDF2 %>%
   filter(Var2>0)

如果4和5的Var2个值都满足唯一性要求,则 Select 的结果应以Var3为基础.所选的Var2值将为5,因为5的Var3值为250,而Var4的值为200,因此:

 Var1   Var2
 7      1
 8      2
 11     3
 14     5

如果这两个Var3值相同,这将是一个随机 Select .

如果不可能为一对获得唯一的解决方案,那么就返回唯一的.例如.

 TheDF3 <- data.frame(VarA=rep(c(7, 8, 11, 14), 4), Var2=c(1,0,0,0, 0,2,2,0, 3,0,0,0, 0,0,0,4), 
                 Var3=c(50, 50, 50, 50, 100, 100, 100, 100, 150, 150, 150, 150, 200, 200, 200, 200))
TheDF3 <- TheDF3 %>%
  filter(Var2>0)

一种解决方案是,使用Var3个权重:

 Var1    Var2
 7       3
 8       2
 14      4     

另一种可能的解决方案是:

 Var1     Var2
 7        3
 11       2
 14       4

因为两个解的权重之和是相同的.

编辑:我现在倾向于使用类似于combination method的解决方案来获得Var1Var2的每种组合,将值Var1作为列标题,将值Var2作为单元格值.使用一个新变量作为该行中Var3个变量的和,并使用另一个新变量计算该行中重复项的数量.我也不知道如何实现这一点.

在我正在处理的当前示例中,组合的数量是15,972.

编辑2:所需的组合输出将如下所示(使用DF1):

        7    8    11   14     Duplicates   Weight
 [1]    1    1    1    4      2            350
 [2]    1    1    2    4      1            400
 [3]    1    1    3    4      1            450
 [4]    1    1    4    4      2            500
 [5]    1    2    1    4      1            400
 ...
 [n]    1    2    4    4      1            550

其中VarA变成列标题,每行是Var2个值的每一组合.Duplicates是行中重复的Var2个值的数量,权重是给定VarA值的每个Var2的权重之和.在我给出的简单示例中,Var2值内的所有权重都是相同的.实际上,权重是不同的.例如,对于Var2 2,如果VarA=8,则Var3值可能是120,如果Var4=11,则Var3值可能是245.

在我的用例中,Var1是年龄,Var2是学校,Var3是该年龄段学校的学生数.

推荐答案

我认为你的问题可以被解释为max bipartite matching问题,所以你可以使用igraph包中的max_bipartite_match来解决它

library(igraph)
f <- function(df) {
    # generate bipartite match
    g <- graph_from_data_frame(df) %>%
        set_vertex_attr(name = "type", value = names(V(.)) %in% df$VarA)
    # max bipartite match
    bm <- na.omit(max_bipartite_match(g)$matching)
    # retrieve match pattern and yield output
    v1 <- bm[bm %in% df$VarA]
    v2 <- names(v1)
    data.frame(
        Var1 = `class<-`(v1, class(df$VarA)),
        Var2 = `class<-`(v2, class(df$Var2))
    )
}

您将看到输出(根据您的输入TheDFTheDF2TheDF3)

> f(TheDF)
  Var1 Var2
1    7    1
2    8    2
3   11    3
4   14    4

> f(TheDF2)
  Var1 Var2
1    7    1
2    8    2
3   11    3
4   14    4

> f(TheDF3)
  Var1 Var2
1    7    1
2    8    2
3   14    4

R相关问答推荐

将带有范围的字符串转换为R中的数字载体

多个ggpredicate对象的平均值

无法运行通过R中的Auto.arima获得的ARIMA模型

R Highcharts与两个位置关联的注释

多重RHS固定估计

如何在emmeans中计算连续变量的对比度

二维样条,严格以一个参数递增

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

在ggplot中为不同几何体使用不同的 colored颜色 比例

在ggplot2中更改小提琴情节的顺序

计算满足R中条件的连续列

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

基于数据集属性将科分配给物种

如何平滑或忽略R中变量的微小变化?

将工作目录子文件夹中的文件批量重命名为顺序

如何阻止围堵地理密度图?

是否从列中删除★符号?

抽样变换-REXP与RWEIBUR

如何修改GT表中组名行的 colored颜色 ?

从字符串列中的向量中查找第一个匹配的单词