在R中的列之外构造新的列
在下面的代码中,我按列创建df的子集,然后按特定的秩变量对其进行排序在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 <- 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