2015-10-09 3 views
2

У меня есть кадр данных с столбцом, заполненным данными, подобными этому, на хромосоме, а затем в базовом положении, все в одном столбце. Я заполнил оставшиеся столбцы от V2 до V5 целыми числами, чтобы имитировать аналогичный файл данных.Как создать новые столбцы в data.frame на основе символов буквы и номера символов в столбце в R

> test 
      V1 V2 V3 V4 V5 
1  I.1286480 9 17 25 33 
2  I.1898932 10 18 26 34 
3 I.11871397 11 19 27 35 
4 II.1252994 12 20 28 36 
5 II.18175911 13 21 29 37 
6 III.10298347 14 22 30 38 
7 IV.123478912 15 23 31 39 
8 V.12837471234 16 24 32 40 

с другими данными в следующих колонках. Это огромный набор данных с 115 000 строк. Я хочу создать два новых столбца, один из которых содержит римские цифры (I, II, III, IV, V) и другой столбец, содержащий число, следующее за римскими цифрами. Проблемы, с которыми у меня возникают проблемы, это то, что это вектор объектов символов, поэтому я не уверен, как разбирать буквы из чисел. Я попытался с помощью StrPos из пакета DescTools, но

> StrPos(test$V1, "I") 
[1] 1 1 1 1 1 1 1 NA 
> StrPos(test$V1, "I.") 
[1] 1 1 1 1 1 1 1 NA 

возвращает позиции всех «I» с, а не только объекты с одним экземпляром «I». Мне интересно, будет ли работать substring? Но тогда у меня есть проблема, когда все римские цифры имеют разную длину, а также числа, следующие за римскими цифрами разной длины. Я знаю, что должно быть простое решение этой проблемы, но единственное, что я могу придумать, очень длинное: for и if. Помоги мне, stackoverflow, ты моя единственная надежда!

+1

Вы можете сделать 'cbind 'Или с data.table' setDT (test) [, c ("chr", "pos"): = tstrsplit (V1, ".", Fixed = TRUE)] ' –

ответ

5

Использование separate из tidyr: ("" тест, do.call (rbind, strsplit (as.character (тест $ V1), фиксированный = TRUE)))

library(tidyr) 
separate(test, V1, into = c("chr", "pos")) 
    chr   pos V2 V3 V4 V5 
1 I  1286480 9 17 25 33 
2 I  1898932 10 18 26 34 
3 I 11871397 11 19 27 35 
4 II  1252994 12 20 28 36 
5 II 18175911 13 21 29 37 
6 III 10298347 14 22 30 38 
7 IV 123478912 15 23 31 39 
8 V 12837471234 16 24 32 40 
+0

Это сработало как шарм! Так быстро и удобно, лучше, чем все, что я пытался. Благодарю вас, jeremycg! –