为啥 rev(factor) 不能作为反转 dplyr::top_n() 的 wt 参数的一种方式?

Posted

技术标签:

【中文标题】为啥 rev(factor) 不能作为反转 dplyr::top_n() 的 wt 参数的一种方式?【英文标题】:Why doesn't rev(factor) work as a way to reverse the wt argument of dplyr::top_n()?为什么 rev(factor) 不能作为反转 dplyr::top_n() 的 wt 参数的一种方式? 【发布时间】:2020-12-17 00:30:43 【问题描述】:

目标:返回 thing1=F 和 thing2=MeFirst 的行

为什么这不起作用?

tibble(
    row = 1:10,
    thing1 = c(rep("F",5),rep("L",5)),
    thing2 = c(rep("MeSecond",4),rep("MeFirst",2),rep("MeSecond",4))
) %>%
    mutate(
        thing1 = factor(thing1, levels = c("F", "L")),
        thing2 = factor(thing2, levels = c("MeFirst", "MeSecond"))
    ) %>%
    top_n(
        .,
        n = 1,
        wt = rev(thing1)
    ) %>%
    top_n(
        .,
        n = 1,
        wt = rev(thing2)
    )

以上返回行 2:5。

我知道这确实有效:

tibble(
    row = 1:10,
    thing1 = c(rep("F",5),rep("L",5)),
    thing2 = c(rep("MeSecond",4),rep("MeFirst",2),rep("MeSecond",4))
) %>%
    mutate(
        thing1 = factor(thing1, levels = c("F", "L")),
        thing2 = factor(thing2, levels = c("MeFirst", "MeSecond"))
    ) %>%
    top_n(
        .,
        n = -1,
        wt = thing1
    ) %>%
    top_n(
        .,
        n = -1,
        wt = thing2
    )

但问题是,为什么 rev(thing2) 不起作用?

【问题讨论】:

【参考方案1】:

简短的回答是您想要反转因子的水平,而不是因子本身:

library(dplyr)
library(forcats)

tibble(row = 1:10,
       thing1 = c(rep("F", 5), rep("L", 5)),
       thing2 = c(rep("MeSecond", 4), rep("MeFirst", 2), rep("MeSecond", 4))) %>%
  mutate(thing1 = factor(thing1, levels = c("F", "L")),
         thing2 = factor(thing2, levels = c("MeFirst", "MeSecond"))) %>%
  top_n(n = 1, wt = fct_rev(thing1)) %>%
  top_n(n = 1, wt = fct_rev(thing2))

# A tibble: 1 x 3
    row thing1 thing2 
  <int> <fct>  <fct>  
1     5 F      MeFirst

【讨论】:

以上是关于为啥 rev(factor) 不能作为反转 dplyr::top_n() 的 wt 参数的一种方式?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 rev 规范链接总是使用 302 重定向

Linux命令之反转文本rev

数字反转

CUT   AWK 字符串反转 rev

力扣初级算法——整数反转

为啥我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像