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

问题描述 投票:0回答:2

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

这里有一个可复制的玩具数据来演示:

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 选项,也无法对 array() 进行排序。 我也尝试添加 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  

示例输出被截断

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

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  

示例输出被截断

为什么第二个版本可以工作,而第一个版本不行?我应该更改什么以便我可以在许多列中循环它?
提前致谢! 感谢您的宝贵时间!

(进行小幅编辑以纠正拼写错误。)

r loops sorting dplyr
2个回答
2
投票

这是“使用 dplyr 进行编程”,使用

.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

0
投票

当在选择中重命名列时,这也适用:

select('新名称' = ulgy_old_name) %>%

排列(.data[['新名称']])

© www.soinside.com 2019 - 2024. All rights reserved.