为什么 R dplyr 不能在 for 循环中使用向量元素正确排列排序
Why doesn't R dplyr arrange sort properly using a vector element within a for loop
我无法让 r 的 dplyr::arrange() 在 for 循环中使用时正确排序。我发现很多帖子都在讨论这个问题(比如 with the .by_group=TRUE and using desc() bettter, ex.2 with lists, and ex.3 with filter_all() and %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
示例输出被截断
为什么第二个版本有效,而第一个版本无效?我应该更改什么以便我可以在许多列中循环?
提前致谢!感谢您的宝贵时间!
(稍作修改以更正拼写错误。)
这是“programming with 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
我无法让 r 的 dplyr::arrange() 在 for 循环中使用时正确排序。我发现很多帖子都在讨论这个问题(比如
这里有一个可复制的玩具数据来演示:
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
示例输出被截断
为什么第二个版本有效,而第一个版本无效?我应该更改什么以便我可以在许多列中循环?
提前致谢!感谢您的宝贵时间!
(稍作修改以更正拼写错误。)
这是“programming with 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