tidyr只分开最后n个实例

时间:2018-05-17 12:20:11

标签: r tidy

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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