【问题标题】:Extract vector names conditionally in R在 R 中有条件地提取向量名称
【发布时间】:2020-09-09 14:42:55
【问题描述】:

我正在尝试获取具有某些优先级的向量中元素的名称。

如果有任何元素的值为"integer",则获取第一个此类元素的名称(在下面的示例中,year

但是如果没有值为"integer"的元素,那么对任何值为"numeric"的元素做同样的事情。

我尝试了以下但没有成功(这是一个玩具示例,功能性答案值得赞赏):

cl <- c(group = "character", degree = "numeric", year = "integer", zoo = "integer")

names(cl[cl == "integer" || cl == "numeric"])[1]

desired.output = "year"

【问题讨论】:

    标签: r string vector char extract


    【解决方案1】:

    使用grep

    names(sort(cl[grep("integer|numeric", cl)])[1])
    # [1] "year"
    

    【讨论】:

      【解决方案2】:

      您已经接近了,但到目前为止您的方法存在两个问题:

      1. || 运算符仅适用于一个元素;因为你要查看的不止一个,所以你会想要|。请参阅?`||` 了解更多详情。
      2. 您的方法将平等对待“整数”和“数字”,而不是按照您的喜好优先考虑数字。

      一种方法是:

      Coalesce2 <- function(x, y) if(is.na(x))  y  else  x
      Coalesce2(cl[cl == "integer"][1], cl[cl == "numeric"][1])
      

      注意。我在这里创建了一个新的合并函数而不是使用 dplyr 的唯一原因是它不会以我认为你想要的方式保留名称。

      【讨论】:

        【解决方案3】:

        由于是固定匹配,我们可以使用%in%

        names(sort(cl[cl %in% c('integer', 'numeric')]))[1]
        #[1] "year"
        

        或转换为 factor 并指定 levels

        names(sort(factor(cl, c('integer', 'numeric'))))[1]
        #[1] "year"
        

        match

        names(cl)[na.omit(match(c('integer', 'numeric'), cl))[1]]
        #[1] "year"
        

        【讨论】:

        • 点赞谢谢。你也见过THIS吗?
        • @rnorouzian 我在那里发布了一个解决方案。 “组”不是因子类
        猜你喜欢
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多