首页 > 解决方案 > tidyr 仅分离最后 n 个实例

问题描述

我在 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' 包含相同的分隔符,该分隔符用于分隔要分隔的因素(处理和 canopyPosition)。但是合并只发生在最后一个实例上。

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

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

标签: rtidy

解决方案


在筛选已经回答的类似问题时,我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

推荐阅读