тидыр отделяй только последние n случаев - PullRequest
0 голосов
/ 17 мая 2018

У меня есть data.frame в R, который для простоты содержит один столбец, который я хочу разделить.Следующий пример, отсканированный с помощью tidyr :: Отдельный, почти выполняет работу:

 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', 'underCanopy'.

КакМогу ли я объединить первые экземпляры вместо последних, чтобы отделить только последние n экземпляров?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

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
0 голосов
/ 17 мая 2018

При проверке уже отвеченных похожих вопросов я обнаружил 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
...