为什么 R dplyr 不能使用 for 循环中的向量元素正确排列排序



在for循环中使用时,我遇到了r的dplyr::arrange()正确排序的问题。我发现了许多讨论这个问题的帖子(比如示例1使用.by_group=TRUE并更好地使用desc(),示例2使用列表,以及示例3使用filter_all()和%in%)。然而,我仍然很难理解为什么当我直接使用列名时,我可以让arrange()工作,但当我在一个向量中引用它的索引位置时却不行,这将在稍后的循环中使用,以帮助从更大的数据框中提取数据。

下面是一个可重复的玩具数据来演示:

set.seed(1) 
toy <- data.frame(a=rep(sample(letters[1:5], 4, TRUE)), tf=sample(c("T","F"), 100, TRUE), n1=sample(1:100, 100, TRUE), n2=1:100)
get_it <- colnames(toy)[3:4]

到目前为止,我的初始方法适用于select()部分上的索引向量,但即使使用.by_group选项也无法对arrange()进行排序。我还尝试添加dplyr::arrange(),但没有更改。

j=1  # pretending this is the 1st pass in the loop
toy %>% 
select(a, tf, get_it[j]) %>% 
group_by(a) %>% 
arrange(desc(get_it[j]), .by_group=TRUE)
a     tf     n1
<chr>  <chr>  <int>
a      T     21
a      T     17
a      F     87
a      T     90
a      T     64  

截断的示例输出

但是,当我在arrange()中为相同的列名称切换索引向量时,我得到了预期的排序结果(select仍然可以正常工作):

j=1  # pretending this is the 1st pass through the loop
toy %>% 
select(a, tf, get_it[j]) %>% 
group_by(a) %>% 
arrange(desc(n1), .by_group=TRUE)
a     tf     n1
<chr>  <chr>  <int>
a      F     99
a      F     98
a      F     96
a      F     95
a      T     93  

截断的示例输出

为什么第二个版本可以,而第一个不行?我应该做些什么来让它在许多列中循环?
提前感谢!感谢您的宝贵时间!

(小编辑以纠正错别字)

这是使用dply&quot编程,使用.data通过字符串引用列:

toy %>% 
select(a, tf, get_it[j]) %>% 
group_by(a) %>% 
arrange(desc(.data[[ get_it[j] ]]), .by_group=TRUE)
# # A tibble: 100 x 3
# # Groups:   a [3]
#    a     tf       n1
#    <chr> <chr> <int>
#  1 a     F        99
#  2 a     F        98
#  3 a     F        96
#  4 a     F        95
#  5 a     T        93
#  6 a     T        92
#  7 a     T        92
#  8 a     T        90
#  9 a     F        87
# 10 a     F        86
# # ... with 90 more rows

最新更新