2017-01-26 8 views
1

В r есть data frame (df), как показано ниже, в котором находится ID строка из 10 символов.Разделить строку по количеству символов в столбце кадра данных для создания нескольких столбцов в R?

df: 
     ID   Var1 Var2 
    1 0334KLM001 aa xx 
    2 1334HDM002 zvv rr 
    3 2334WEM003 qetr qwe 
    4 3334OKT004 ff sdf 
    5 4334WER005 ee sdf 
    6 5334BBC006 qly ssg 
    7 6334QQQ007 kk htj 
    8 7334AAA008 uu yjy 
    9 8334CBU009 ww wttt 
    10 9334MLO010 aa dg 

Намерение:
Использование r команды, я хотел бы разделить ID на две дополнительные колонки только по числа символов. Например, я хотел бы добавить два Columns (Spl_1 & Spl_2) в df которых Spl_1 имеет первые четыре символа из ID колонны и Spl_2 имеет остаток ID характера (т.е. 5:10).

Ожидаемое output будет так:

output: 

    ID   Var1 Var2 Spl_1 Spl_2 
1 0334KLM001 aa xx  0334 KLM001 
2 1334HDM002 zvv rr  1334 HDM002 
3 2334WEM003 qetr qwe  2334 WEM003 
4 3334OKT004 ff sdf  3334 OKT004 
5 4334WER005 ee sdf  4334 WER005 
6 5334BBC006 qly ssg  5334 BBC006 
7 6334QQQ007 kk htj  6334 QQQ007 
8 7334AAA008 uu yjy  7334 AAA008 
9 8334CBU009 ww wttt 8334 CBU009 
10 9334MLO010 aa dg  9334 MLO010 

Я прочитал следующие вопросы: Q1 & Q2 .Although очень информативные, но до сих пор я не получил, что, как разделить жало по номерам символов. Я нашел пакет «stringr», который я узнал с помощью команды str_sub, я могу разделить по числу. смотри ниже:

library(stringr) 
ID <- "0334KLM001" 
str_sub(ID, c(1,5), c(4,10)) 
[1] "0334" "KLM001" 

Но я не знаю, как комбинировать с другими r командой (ами), чтобы получить output как указано выше?

+2

'DF $ spl_1 <- зиЬзЬг (DF $ ID, 1, 4); df $ spl_2 <- substr (df $ ID, 5, 10) 'должен это сделать. – lmo

ответ

3

Мы можем использовать separate

library(tidyr) 
separate(df, ID, into = c("Spl_1", "Spl_2"), sep = 4, remove = FALSE) 
#   ID Spl_1 Spl_2 Var1 Var2 
#1 0334KLM001 0334 KLM001 aa xx 
#2 1334HDM002 1334 HDM002 zvv rr 
#3 2334WEM003 2334 WEM003 qetr qwe 
#4 3334OKT004 3334 OKT004 ff sdf 
#5 4334WER005 4334 WER005 ee sdf 
#6 5334BBC006 5334 BBC006 qly ssg 
#7 6334QQQ007 6334 QQQ007 kk htj 
#8 7334AAA008 7334 AAA008 uu yjy 
#9 8334CBU009 8334 CBU009 ww wttt 
#10 9334MLO010 9334 MLO010 aa dg 

Если мы хотим, 3 колонки, мы можем пропускать vector в sep

separate(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), sep = c(4,8), remove = FALSE) 
#   ID Spl_1 Spl_2 Spl_3 Var1 Var2 
#1 0334KLM001 0334 KLM0 01 aa xx 
#2 1334HDM002 1334 HDM0 02 zvv rr 
#3 2334WEM003 2334 WEM0 03 qetr qwe 
#4 3334OKT004 3334 OKT0 04 ff sdf 
#5 4334WER005 4334 WER0 05 ee sdf 
#6 5334BBC006 5334 BBC0 06 qly ssg 
#7 6334QQQ007 6334 QQQ0 07 kk htj 
#8 7334AAA008 7334 AAA0 08 uu yjy 
#9 8334CBU009 8334 CBU0 09 ww wttt 
#10 9334MLO010 9334 MLO0 10 aa dg 

Если цифры в начале не фиксированной длины, использование extract

extract(df, ID, into = c("Spl_1", "Spl_2"), "^([0-9]+)(.*)", remove = FALSE) 

и 3 столбцов,

extract(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), "(.{4})(.{4})(.*)", remove = FALSE) 
+0

Ради моего любопытства, что, если я хочу три столбца тогда. например Spl_1 (1: 4), Spl_2 (5: 8), Spl_3 (9:10). например, для 0334KLM001 это будет 0334, KLM0, 01? – Daniel

+1

@ Daniel Вы можете использовать 'extract' ie' extract (df, ID) в = c («Spl_1», «Sp1_2», «Sp1_3»), «(. {4}) (. {4}) (. *) ")' или 'отдельно (df, ID, в = c (" Spl_1 "," Spl_2 "," Spl_3 "), sep = c (4,8), remove = FALSE)' – akrun

 Смежные вопросы

  • Нет связанных вопросов^_^