在R中的列之外构造新的列

在R中的列之外构造新的列,r,R,在下面的代码中,我按列创建df的子集,然后按特定的秩变量对其进行排序 df <- data.frame( id=c("a","b","c","d","e","f"), rank1=c(1,3,2,1,5,7), rank2=c(4,6,2,1,4,2), rank3=c(4,6,2,1

在下面的代码中,我按列创建df的子集,然后按特定的秩变量对其进行排序

    df <- data.frame(
          id=c("a","b","c","d","e","f"),
          rank1=c(1,3,2,1,5,7),
          rank2=c(4,6,2,1,4,2),
          rank3=c(4,6,2,1,4,2))
        
        for(i in colnames(df)[-1]) {
  assign(i, df %>% 
           arrange(desc(across(all_of(i)))) %>%
           select(id))
}
df%
排列(描述(跨越(i)的所有部分)%>%
选择(id))
}
现在,我想将这些排名子集组合成一个新的数据框架和一个排名变量。这将创建新的数据帧:

rankings <- data.frame(
            rank=1:6
)

rankings使用当前在env中创建多个对象的代码,通过指定
ls
pattern
参数以匹配对象名称子字符串,使用
imap
将这些对象放入
列表中,
rename
使用列表元素的名称(
.y
)重命名“id”列,将它们按列方式绑定到单个数据集(
\u dfc
),然后再绑定“排名”数据

library(dplyr)
library(purrr)
mget(ls(pattern = '^rank\\d+$')) %>%
     imap_dfc(~ .x %>%
                  rename(!! .y := id)) %>%
     bind_cols(rankings, .)
-输出

#   rank rank1 rank2 rank3
#1    1     f     b     b
#2    2     e     a     a
#3    3     b     e     e
#4    4     c     c     c
#5    5     a     f     f
#6    6     d     d     d

此外,不必执行
分配
来创建多个对象,然后从全局环境收集这些对象,而是可以通过在具有“秩”的列之间循环
,以更直接的方式完成此操作,根据这些列的降序排列顺序返回“id”列,然后将
rank
列创建为行序列(
row\u number()


什么是我实际代码的
聚集的
残余-我更正了它。很抱歉在代码中,您是
select
ing id而不是rank的列,即应该是
select(全部(i))
,这就是我想要做的。在最后一个数据帧中,我想对前15行进行切片,然后比较不同排名系统中前15行之间的重叠。当您选择idThis适用于我的示例代码时,不清楚您是如何获得预期的
1:55
!我的实际数据集排名列名有所不同。就像在“rank1”、“排名系统”、“另一个排名系统”中一样。我很抱歉没有说清楚。@fahans然后,您可以更改
模式='rank'
以匹配全局环境中的任何排名对象,或者使用
模式='rank\\d+$\ranking\u system$'
@fahans我更新了一个更简单的方法来解决这个问题
df %>% 
    transmute(across(contains('rank'), ~ id[order(-.)])) %>%
    mutate(rank = row_number(), .before = 1)
#  rank rank1 rank2 rank3
#1    1     f     b     b
#2    2     e     a     a
#3    3     b     e     e
#4    4     c     c     c
#5    5     a     f     f
#6    6     d     d     d