【问题标题】:tidyr separate only last n instancestidyr 仅分离最后 n 个实例
【发布时间】:2018-05-17 12:20:10
【问题描述】:

我在 R 中有一个 data.frame,为简单起见,它有一列我想分开。 以下示例使用 tidyr::separate 截断,几乎可以完成这项工作:

 tmp2 <- data.frame( varTreatName = c(
   "resp_Nadd_belowCanopy", "resp_NPadd_belowCanopy"
   , "resp_sd_Nadd_belowCanopy", "resp_sd_NPadd_belowCanopy"))
 tmp2 %>% separate(
    "varTreatName", c("varName","treatment","canopyPosition")
    , extra = "merge")

产生:

varName treatment    canopyPosition
1    resp      Nadd       belowCanopy
2    resp     NPadd       belowCanopy
3    resp        sd  Nadd_belowCanopy
4    resp        sd NPadd_belowCanopy

多个实例合并到一列。但是请注意,在所描述的情况下,第一个实例 varName 'resp_sd' 包含与 通过划分要分离的因素(处理和冠层位置)来使用。但是合并只发生在最后一个实例上。

因此,在上面示例的最后一行中,我希望提取:'resp_sd'、'NPadd'、'belowCanopy'。

如何合并第一个实例而不是最后一个实例以便仅分离最后 n 个实例?

【问题讨论】:

    标签: r tidy


    【解决方案1】:

    在筛选已经回答的类似问题时,我在this answer中发现了tidyr::extract,可以用来做这项工作:

     tmp2 %>% extract(
       "varTreatName", c("varName","treatment","canopyPosition")
       , regex = "(.*)_([^_]+)_([^_]+)$")
    

    产生预期的结果:

      varName treatment canopyPosition
    1    resp      Nadd    belowCanopy
    2    resp     NPadd    belowCanopy
    3 resp_sd      Nadd    belowCanopy
    4 resp_sd     NPadd    belowCanopy
    

    【讨论】:

      【解决方案2】:

      tidyr::separate 接受正则表达式,所以你也可以这样做:

      library(dplyr)
      library(tidyr)
      
      tmp2 %>% 
        separate("varTreatName", c("varName","treatment","canopyPosition"), 
                 , sep = "_(?!s)", extra = "merge")
      

      结果:

        varName treatment canopyPosition
      1    resp      Nadd    belowCanopy
      2    resp     NPadd    belowCanopy
      3 resp_sd      Nadd    belowCanopy
      4 resp_sd     NPadd    belowCanopy
      

      【讨论】:

      • 感谢您的回答。请您解释一下分隔符上的正则表达式是如何工作的?在示例的微基准测试中,基于提取的解决方案快了大约三分之一。
      • @ThomasWutzler separatesep 参数使用正则表达式来拆分列。 _(?!s) 表示一个字面量“_”,后面不跟一个 s。所以我用所有下划线分开,除了resp_sd之间的下划线,因为“​​s”跟在下划线后面。
      • @ThomasWutzler 我认为extract 更快,因为它只有一个匹配项,而separate 有多个匹配项可供搜索。
      • 感谢@user 对正则表达式的解释。我看到它非常特定于分隔符后面的示例中的模式。
      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2012-03-09
      相关资源
      最近更新 更多