当前位置: 首页 > 知识库问答 >
问题:

使用dplyr按所有列排列数据帧

雷方伟
2023-03-14

我正在生成1和0的数据帧,如下所示:

library(tidyverse)
library(glue)

num_var <- 3

rep(list(c(0L, 1L)), num_var) %>%
  set_names(glue("var_{seq_len(num_var)}")) %>%
  expand.grid() %>%
  mutate(total = rowSums(.)) %>%
  select(total, everything()) %>%
  arrange(total, desc(var_1, var_2, var_3))

#>   total var_1 var_2 var_3
#> 1     0     0     0     0
#> 2     1     1     0     0
#> 3     1     0     1     0
#> 4     1     0     0     1
#> 5     2     1     1     0
#> 6     2     1     0     1
#> 7     2     0     1     1
#> 8     3     1     1     1

由reprex软件包(v0.1.1.9000)于2018-01-08创建。

我需要按变量的总和升序排列,然后按每个变量的降序排列。使用dplyr::arrange()相当简单。然而,我想有一个更稳健的安排方法。例如,如果num_var更改为,那么最后一行也必须更改为arrange(total,desc(var_1,var_2,var_3,var_4))。我尝试使用整齐的选择器everything()进行排列,就像使用select()函数一样,但出现以下错误:

library(tidyverse)
library(glue)

num_var <- 3

rep(list(c(0L, 1L)), num_var) %>%
  set_names(glue("var_{seq_len(num_var)}")) %>%
  expand.grid() %>%
  mutate(total = rowSums(.)) %>%
  select(total, everything()) %>%
  arrange(total, desc(everything()))

#> Error in arrange_impl(.data, dots): Evaluation error: No tidyselect variables were registered.

由reprex软件包(v0.1.1.9000)于2018-01-08创建。

有没有办法选择变量进行排列而不直接命名它们?

共有3个答案

司马宏茂
2023-03-14

可以使用此代码按从左到右排列的每一列

library(magrittr) ; library(rlang) ; library(dplyr)
data %>% arrange(!!!syms(colnames(.)))

这有效,因为排列不接受整洁选择语法,因此必须为每个名称传递符号(或者也可能是字符串)

锺离赤岩
2023-03-14

对于< code>dplyr的较新版本,您现在可以在以下位置使用< code >:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

iris %>% 
  arrange(across(everything(), desc)) %>% 
  head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1          7.9         3.8          6.4         2.0 virginica
#> 2          7.7         3.8          6.7         2.2 virginica
#> 3          7.7         3.0          6.1         2.3 virginica
#> 4          7.7         2.8          6.7         2.0 virginica
#> 5          7.7         2.6          6.9         2.3 virginica
#> 6          7.6         3.0          6.6         2.1 virginica


all.equal(iris %>% 
            arrange(across(everything(), desc)) ,
          iris %>% 
            arrange(desc(Sepal.Length), desc(Sepal.Width), desc(Petal.Length), desc(Petal.Width), desc(Species)))
#> [1] TRUE

< sup >由reprex软件包(v2.0.1)于2022-02-07创建

濮翰学
2023-03-14

< code >排列似乎不能直接与选择辅助函数一起工作。您可以按升序使用< code>arrange_at、< code>total,并按降序使用除< code>total(选择使用< code>-one_of("total"))以外的其他变量:

arrange_at(vars(total, desc(-one_of("total"))))

#  total var_1 var_2 var_3
#1     0     0     0     0
#2     1     1     0     0
#3     1     0     1     0
#4     1     0     0     1
#5     2     1     1     0
#6     2     1     0     1
#7     2     0     1     1
#8     3     1     1     1
 类似资料:
  • 我有以下数据框架(这里是样本): 我想按时间戳列排列,但我收到以下错误: arrange_impl错误(。data,dots):参数1是不支持的矩阵类型 请建议如何使其工作。我知道时间戳是一个函数和矩阵,但这里它是一个列,我“希望”“理解”它是一列。 正如@sotos所问:

  • 我试图弄清楚如何使用tidyverse来动态排列数据帧。我以前用arrange_但是现在不推荐用了。 一些更详细的细节。我需要安排数字,如果不是,则升序。我有内置的逻辑,但我不知道如何让它与安排一起工作。 一些数据: 某些代码: 有人有使用tidyverse的解决方案吗? 谢谢

  • 我需要创建一个列表的所有排列,但不包括那些有相同的数字改变的符号。 例如,从序列 我将获得如下所有排列: 请注意:使用这些排列,我需要做进一步的操作(我需要找到给出所有可能的数对的最小排列数),所以我认为我需要将它们存储在一个变量中,也是因为在算法的最后,我需要将结果存储在一个文件中。 ...好的,伙计们,你们的回答很好,我喜欢你们的兴趣...现在,如果我用30个元素(积极和消极)来表示我的变量r

  • 我开始在我的项目中使用primefaces,我马上就遇到了问题。我有一个列表,其中包含一些我用实体管理器从数据库中获取的东西,我在primefaces数据表的视图中显示了它。在我的后台bean中,我有:List getList(),在这里我使用实体管理器从数据库中检索记录,并立即返回。。 和myService: 我的豆子: 视图: 这种方式primefaces排序不起作用,我在堆栈上的某个地方读到

  • 我遇到了一个问题,我需要将两列实体相乘来排序,为了想象,实体是: 我不能使用命名查询,因为我的查询基于用户输入进行了大量筛选(不能将where子句放入查询,因为如果用户没有选择任何值,where子句不能只在查询中)。 为了简单点。我需要类似findAll(谓词,Pageable)的东西,但我需要强制查询按“amount*unitPrice”对其进行排序,但也要保持我的Preditate(过滤器)和

  • 问题内容: 有没有一种方法可以获取实例中所有数据库中所有存储过程中引用的所有列和表?输出应为: 问题答案: 这将得到您想要的列表,但是,如果您在动态SQL中嵌入了此类列引用(并且可能找不到依赖于延迟名称解析的引用),则将无济于事。SQL Server不会解析存储过程的文本以提供DMV输出。 现在尝试使用子句来处理在同一服务器上具有不同归类的数据库的情况。 如果您的数据库处于80兼容模式,那么该语法