R + изменить: используя colsplit с регулярным выражением

Я пытаюсь использовать colsplit, чтобы разбить вектор в кадре данных. Тот факт, что у нас есть регулярное выражение как arg to colsplit, заставляет меня думать, что это может быть гибким, но у меня возникли проблемы (возможно, я просто не понимаю регулярное выражение в R).

Вот проблема:

давайте создадим вектор...

> library(reshape)
> my_var_1 <- factor(c("x00_aaa_123","x00_bbb_123","x00_ccc_123","x01_aaa_123","x01_bbb_123","x01_ccc_123","x02_aaa_123","x02_bbb_123","x02_ccc_123"))

Я хотел бы разбить его на две колонки на первом подчеркивании. Другими словами, я хочу, чтобы мой конечный результат был таким...

    x whatever
1 x00  aaa_123
2 x00  bbb_123
3 x00  ccc_123
4 x01  aaa_123
5 x01  bbb_123
6 x01  ccc_123
7 x02  aaa_123
8 x02  bbb_123
9 x02  ccc_123

Я пытаюсь найти правильное регулярное выражение внутри colspan, которое сделает это, но не повезло. Вот ближе всего я могу получить...

> colsplit(my_var_1, split="_", c("x","whatever")) 
    x whatever NA.
1 x00      aaa 123
2 x00      bbb 123
3 x00      ccc 123
4 x01      aaa 123
5 x01      bbb 123
6 x01      ccc 123
7 x02      aaa 123
8 x02      bbb 123
9 x02      ccc 123

Это использует разделенное регулярное выражение в качестве простого разделителя и дает мне три столбца. Я не хотел бы разбивать второе подчеркивание (что еще хуже, в моих реальных данных у меня есть произвольное количество подчеркиваний, а не только два).

Можно ли использовать выражение для "split", которое даст то, что я хочу?

Я надеялся, что регулярное выражение в colsplit позволит мне сопоставлять группы, а групповые совпадения будут содержимым разбиений, но, похоже, это не так.

* редактировать (благодаря @Joshuaulrich) colsplit работает "как задумано" при использовании более нового reshape2!!!

1 ответ

Решение

Ваш код выдает ошибку для меня:

> colsplit(my_var_1, split="_", c("x","whatever"))
Error in colsplit(my_var_1, split = "_", c("x", "whatever")) : 
  unused argument(s) (split = "_")

split не аргумент colsplit, Аргумент, который вы хотите pattern, или вы можете просто положиться на позиционное соответствие:

> colsplit(my_var_1, "_", c("x","whatever"))
    x whatever
1 x00  aaa_123
2 x00  bbb_123
3 x00  ccc_123
4 x01  aaa_123
5 x01  bbb_123
6 x01  ccc_123
7 x02  aaa_123
8 x02  bbb_123
9 x02  ccc_123
Другие вопросы по тегам