`fct_reorder2` 如何计算这个结果?
How does `fct_reorder2` compute this result?
尽管参考了 this 线程,我还是很难理解以下输出:
df <- tibble::tribble(
~color, ~a, ~b,
"blue", 1, 2,
"green", 6, 2,
"purple", 3, 3,
"red", 2, 3,
"yellow", 5, 1
)
给出:
> fct_reorder2(df$color, df$a, df$b, .fun = min, .desc = TRUE)
[1] blue green purple red yellow
Levels: purple green red blue yellow
我知道您应该使用 .fun
与 fct_reorder2
不同的方式。这里的 min
函数计算所有提供值的最小值,这里是 df$a
和 df$b
中的值。我仍然不会期望我得到的结果。有人可以解释一下吗?
其中一个链接的答案因查看源代码而被否决,但你问的是如何我认为实际查看 fct_reorder2
的代码是有意义的。
# This is fine, just checking if it's a factor and assigning the value.
f <- check_factor(.f)
# Also fine, they're columns from a data.frame
stopifnot(length(f) == length(.x), length(.x) == length(.y))
# We're not using dots
ellipsis::check_dots_used()
除此之外,我们可以使用带有原始数据的后续代码:
summary <- tapply(seq_along(.x), f, function(i) .fun(.x[i], .y[i], ...))
# for us equivalent to
tapply(seq_along(df$a), df$color, function(i) {min(df$a[i], df$b[i])})
# blue green purple red yellow
# 1 2 3 2 1
在这种情况下,这只是 df$a
和 df$b
列的成对最小值
如果每种颜色有多行,它将使用因子水平的任何行或列中的最小值。
lvls_reorder(.f, order(summary, decreasing = .desc))
这只是根据这些值按降序对级别进行排序,因此具有 最大 列 a 和 b 的成对最小值的颜色排在第一位。
在关系的情况下,我们可以看到它按字典顺序排序导致我们看到的输出。
color
a
b
pmin
dense rank
descending order
(Lexicographically sorted for ties)
blue
1
2
1
1
4
green
6
2
2
2
2
purple
3
3
3
3
1
red
2
3
2
2
3
yellow
5
1
1
1
5
df <- tibble::tribble(
~color, ~a, ~b,
"blue", 1, 2,
"green", 6, 2,
"purple", 3, 3,
"red", 2, 3,
"yellow", 5, 1
)
df %>% mutate(
nr = 1:5,
min = ifelse(a<=b, a, b)
) %>% arrange(desc(min), nr)
输出
# A tibble: 5 x 5
color a b nr min
<chr> <dbl> <dbl> <int> <dbl>
1 purple 3 3 3 3
2 green 6 2 2 2
3 red 2 3 4 2
4 blue 1 2 1 1
5 yellow 5 1 5 1
那应该把一切都搞清楚了。
尽管参考了 this 线程,我还是很难理解以下输出:
df <- tibble::tribble(
~color, ~a, ~b,
"blue", 1, 2,
"green", 6, 2,
"purple", 3, 3,
"red", 2, 3,
"yellow", 5, 1
)
给出:
> fct_reorder2(df$color, df$a, df$b, .fun = min, .desc = TRUE)
[1] blue green purple red yellow
Levels: purple green red blue yellow
我知道您应该使用 .fun
与 fct_reorder2
不同的方式。这里的 min
函数计算所有提供值的最小值,这里是 df$a
和 df$b
中的值。我仍然不会期望我得到的结果。有人可以解释一下吗?
其中一个链接的答案因查看源代码而被否决,但你问的是如何我认为实际查看 fct_reorder2
的代码是有意义的。
# This is fine, just checking if it's a factor and assigning the value.
f <- check_factor(.f)
# Also fine, they're columns from a data.frame
stopifnot(length(f) == length(.x), length(.x) == length(.y))
# We're not using dots
ellipsis::check_dots_used()
除此之外,我们可以使用带有原始数据的后续代码:
summary <- tapply(seq_along(.x), f, function(i) .fun(.x[i], .y[i], ...))
# for us equivalent to
tapply(seq_along(df$a), df$color, function(i) {min(df$a[i], df$b[i])})
# blue green purple red yellow
# 1 2 3 2 1
在这种情况下,这只是 df$a
和 df$b
列的成对最小值
如果每种颜色有多行,它将使用因子水平的任何行或列中的最小值。
lvls_reorder(.f, order(summary, decreasing = .desc))
这只是根据这些值按降序对级别进行排序,因此具有 最大 列 a 和 b 的成对最小值的颜色排在第一位。 在关系的情况下,我们可以看到它按字典顺序排序导致我们看到的输出。
color | a | b | pmin | dense rank | descending order (Lexicographically sorted for ties) |
---|---|---|---|---|---|
blue | 1 | 2 | 1 | 1 | 4 |
green | 6 | 2 | 2 | 2 | 2 |
purple | 3 | 3 | 3 | 3 | 1 |
red | 2 | 3 | 2 | 2 | 3 |
yellow | 5 | 1 | 1 | 1 | 5 |
df <- tibble::tribble(
~color, ~a, ~b,
"blue", 1, 2,
"green", 6, 2,
"purple", 3, 3,
"red", 2, 3,
"yellow", 5, 1
)
df %>% mutate(
nr = 1:5,
min = ifelse(a<=b, a, b)
) %>% arrange(desc(min), nr)
输出
# A tibble: 5 x 5
color a b nr min
<chr> <dbl> <dbl> <int> <dbl>
1 purple 3 3 3 3
2 green 6 2 2 2
3 red 2 3 4 2
4 blue 1 2 1 1
5 yellow 5 1 5 1
那应该把一切都搞清楚了。