以特定方式排列数据框

2024-04-15

提前抱歉,标题不好,但我真的不知道如何简洁地表达它。

我正在使用一个数据框,其中的项目可以属于 4 个类别中的任何一个,而不限于 1 个类别。这是我正在使用的虚拟矩阵的示例:

ID <- 1:7
A <- c(1,0,0,1,1,0,0)
B <- c(0,1,0,0,1,0,1)
C <- c(0,0,0,0,0,1,1)
D <- c(1,0,1,1,0,0,0)
A_B <- (A+B > 0)*1
C_D <- (C+D > 0)*1
Cost <- c(25, 52, 11, 75, 45, 5, 34)

df <- data.frame(ID, A, B, C, D, A_B, C_D, A_B_C_D = 1, Cost)
df

ID A B C D A_B C_D A_B_C_D Cost
1  1 0 0 1  1   1     1     25
2  0 1 0 0  1   0     1     52
3  0 0 0 1  0   1     1     11
4  1 0 0 1  1   1     1     75
5  1 1 0 0  1   0     1     45
6  0 0 1 0  0   1     1     5
7  0 1 1 0  1   1     1     34

我需要组织这个数据框,使得第1行包含A,第2行包含B,第3行包含C,第4行包含D,第5行包含A或B,第6行包含C或D,第7行包含任何内容剩下的。我不能使用arrange自从开始desc(A)将自动给出 1, 4, 5。此问题的可接受的解决方案是:

Order <- c(4, 2, 7, 1, 5, 3, 6)
df[Order,]
df

ID A B C D A_B C_D A_B_C_D Cost
4  1 0 0 1   1   1       1   75
2  0 1 0 0   1   0       1   52
7  0 1 1 0   1   1       1   34
1  1 0 0 1   1   1       1   25
5  1 1 0 0   1   0       1   45
3  0 0 0 1   0   1       1   11
6  0 0 1 0   0   1       1    5

本质上,对角线需要是 7 条直线,但我想不出如何对其进行编程以正确排序,无论数据集如何。我觉得这应该很容易,但我只是没有看到。换位思考会不会更容易?

提前致谢。


一种方法是使用蛮力,通过获取行排列的所有排列并检查哪些排列满足对角线期望:

z <- apply(permute::allPerms(1:7), 1, function(x){
  mat <- as.matrix(df[,2:8])
  if(all(diag(mat[x,]) == rep(1,7))){
    return(df[x,])
  }
  })

那么你可以删除 NULL 值:

z <- Filter(Negate(is.null), z)

并得到全部88个解

length(z) #88

z[[5]] #random solution
#output

  ID A B C D A_B C_D A_B_C_D Cost
1  1 1 0 0 1   1   1       1   25
2  2 0 1 0 0   1   0       1   52
6  6 0 0 1 0   0   1       1    5
4  4 1 0 0 1   1   1       1   75
5  5 1 1 0 0   1   0       1   45
3  3 0 0 0 1   0   1       1   11
7  7 0 1 1 0   1   1       1   34

要获得第一个匹配的排列,可以使用 while 循环:

perms <- permute::allPerms(1:7)
mat <- as.matrix(df[,2:8])
i <- 1
while (!all(diag(mat[perms[i,],])  == rep(1,7))) {
  i = i+1
}

df[perms[i,],]

#  ID A B C D A_B C_D A_B_C_D Cost
1  1 1 0 0 1   1   1       1   25
2  2 0 1 0 0   1   0       1   52
6  6 0 0 1 0   0   1       1    5
3  3 0 0 0 1   0   1       1   11
4  4 1 0 0 1   1   1       1   75
7  7 0 1 1 0   1   1       1   34
5  5 1 1 0 0   1   0       1   45

让我们检查一下速度:

test <- function(df){
  z <- apply(permute::allPerms(1:7), 1, function(x){
    mat <- as.matrix(df[,2:8])
    if(all(diag(mat[x,]) == rep(1,7))){
      return(df[x,])
    }
  })
  z <- Filter(Negate(is.null), z)
  return(z)
}

test2 <- function(df){
  perms <- permute::allPerms(1:7)
  mat <- as.matrix(df[,2:8])
  i <- 1
  while (!all(diag(mat[perms[i,],])  == rep(1,7))) {
    i = i+1
  }
  df[perms[i,],]
}
microbenchmark::microbenchmark(b <- test(df), 
                           c <- test2(df), times = 10L)

    Unit: milliseconds
           expr       min        lq      mean   median        uq       max neval cld
  b <- test(df) 392.68257 396.81450 412.41600 401.0613 408.15582 509.77693    10   b
 c <- test2(df)  46.11754  46.92276  47.80778  47.3977  48.82543  50.05795    10  a 

没那么糟糕

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以特定方式排列数据框 的相关文章

  • 如何将带有观察计数的标签添加到 stat_summary ggplot?

    我有一个数据集 例如 outcome lt c rnorm 500 45 10 rnorm 250 40 12 rnorm 150 38 7 rnorm 1000 35 10 rnorm 100 30 7 group lt c rep A
  • 访问 R 工作区中的数据[重复]

    这个问题在这里已经有答案了 我是自学 R 的 可能有一些非常基本的东西我可能不熟悉 如果是这样我道歉 我正在尝试访问外部来源提供给我的数据 它作为一个工作空间出现 我的流程如下 gt ls 1 2003OHT HR gt attach 20
  • 在 Shiny 中叠加两个 ggplot

    我有一个非常大的数据集 我正在使用 ggplot 在 Shiny 上绘制它 我有一个与 x 轴上的值相关联的滑块 我想用它对选定的数据子集重新着色 并让其余数据保持原样 最简单的选择是重新创建整个绘图 但由于它是一个大型数据集 因此这是一个
  • R:如何找到向量的模式[重复]

    这个问题在这里已经有答案了 下面是我的data frame我想知道每个内存类别 1 到 8 的模式是什么 gt dput d structure list MEMORY1 c 5 5 7 1 5 6 4 5 4 5 5 4 1 5 5 2
  • 将不同的 grViz 组合成一个图

    我想结合不同的DiagrammeR绘制成一个图形 生成的图如下例所示 library DiagrammeR pDia lt grViz digraph boxes and circles a graph statement graph ov
  • R data.table 连接不等式条件

    我想使用 data table 包根据多个不等式条件对数据进行子集化 data table 手册中的示例展示了如何使用字符变量执行此操作 但不显示数字不等式 我还了解了如何使用子集函数来执行此操作 但我真的很想利用 data table 二
  • 为每个因素级别添加日期时间序列

    我有一个带有因子列的数据框 s lt data frame id 901 910 s id lt as factor s id 我有一个日期时间序列 library lubridate start lt now as difftime 2
  • 改进R中从google获取股票新闻数据的功能

    我已经编写了一个函数来从 Google 获取和解析给定股票代码的新闻数据 但我确信有一些方法可以改进它 对于初学者来说 我的函数返回一个 GMT 时区的对象 而不是用户当前的时区 如果传递的数字大于 299 它就会失败 可能是因为 goog
  • 在`rmarkdown`中,如何在句子中添加图标?

    In rmarkdown 如何在句子中添加图标 例如如下 如何添加markdown icon单词 Markdown 和 is 之间 有一个很好的 R 包 可以轻松下载 RMarkdown 文档并将图标添加到其中 icons https gi
  • 如何使用autoconf重新生成配置文件?

    我使用 autoconf 重新生成配置文件 它有效 但是当我执行生成的配置文件时 configure 有一些错误消息 例如 configure line 3713 syntax error near unexpected token bla
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 根据 R 数据框中的名称对列进行平均

    我想知道是否有一种有效的方法来获取每组的平均值类似命名的列谁的名字结尾为 1S and 2S ex ex1S ex2S at time 1并取每组的平均值类似命名的列谁的名字结尾为 1C or 2C ex ex1C ex2C at time
  • 按组计算连续行中的值之间的差异

    这是我的一个df 数据框 group value 1 10 1 20 1 25 2 5 2 10 2 15 我需要按组计算连续行中的值之间的差异 所以 我需要一个结果 group value diff 1 10 NA because the
  • R Leaflet Legend:colorBin-删除中断之间的小数

    我正在使用 Leaflet 库在 R 中创建交互式 HTML 地图 传说中采用的是colorBin用于创建将数据分为 6 个类别的方法 使用min values and max values 我已经定义了美国社区调查收入数据的特定范围可能落
  • R 多元一步预测和准确性

    我想使用 R 来比较两个预测模型的 RMSE 均方根误差 第一个模型使用 1966 年至 2000 年的估计值来预测 2001 年 然后使用 1966 年至 2001 年的估计值来预测 2002 年 依此类推直至 2015 年 第二个模型使
  • 更改 pander 中的默认对齐方式 (pandoc.table)

    我目前正在切换到pander对于我的大部分时间knitr markdown格式化 因为它提供了如此出色的pandoc支持 我不太满意的一件事是默认的居中对齐 营销人员可能会喜欢它 但对于技术报告来说这是一个可怕的事情 使用的最佳选择Hmis
  • 使用 ggplot 构面时增加闪亮的绘图大小

    有没有办法增加绘图窗口的大小shiny取决于在一个中使用的面的数量ggplot图 也许使用垂直滚动 例如 使用下面的示例 当输入为 A 有三个方面 情节看起来不错 当选项 B 选择绘图数量会增加 但绘图窗口保持相同大小 导致绘图太小 是否有
  • 按特定样本前缀对列名称向量进行子集化

    假设我有一个如下所示的数据框 ca01 lt c 1 10 ca02 lt c 2 11 ca03 lt c 3 12 stuff 1 lt rep test 10 other lt rep 9 10 data lt data frame
  • 通过使用 navbarPanel() 并隐藏导航栏构建多页闪亮应用程序用户端(在 ui.R 中)?

    我想构建一个多页闪亮应用程序 我可以在其中控制用户可以看到哪个页面 迪安 阿塔利确实这个演示应用程序中有类似的东西 https github com daattali advanced shiny tree master multiple

随机推荐