2016-03-05 2 views
2

В качестве варианта this questionРасщепление вектор строк в dataframe с колоннами, содержащие соответствующие символы

У меня есть вектор со строками, каждая строка имеет от 2 до 4 символов.

Strng <- c("XDX", "GUV", "FQ", "ACUE", "HIT", "AYX", "NFD", "AHBW", "GKQ", "PYF") 

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

Так (возможно) после применения этого:

ss<-strsplit(Strng,"") 
z<-lapply(ss,as.character) 

Я хотел бы иметь dataframe так:

>df 
"X" "D" "X" "0" 
"G" "U" "V" "0" 
"F" "Q" "0" "0" 
"A" "C" "U" "E" 
"H" "I" "T" "0" 
"A" "Y" "X" "0" 
"N" "F" "D" "0" 
"A" "H" "B" "W" 
"G" "K" "Q" "0" 
"P" "Y" "F" "0" 

Любые идеи?

Спасибо,

Калин

+1

Вот основу R альтернатива неможет (sapply (сс, «длиной <-», не более (длина (сс)))) '(вы можете заменить NA с 0 после этого, если необходимо) –

ответ

4

Вот альтернатива с "data.table":

library(data.table) 
setDT(tstrsplit(Strng, "", fill = "0"))[] 
#  V1 V2 V3 V4 
# 1: X D X 0 
# 2: G U V 0 
# 3: F Q 0 0 
# 4: A C U E 
# 5: H I T 0 
# 6: A Y X 0 
# 7: N F D 0 
# 8: A H B W 
# 9: G K Q 0 
# 10: P Y F 0 

Вы также можете использовать cSplit из моего пакета «splitstackshape», но она наполняет NA и использует немного странно синтаксис:

library(splitstackshape) 
cSplit(data.table(Strng), "Strng", "", stripWhite = FALSE) 
3

Мы можем использовать stri_list2matrix из stringi после того как мы разделили "Strng" на list.

library(stringi) 
stri_list2matrix(strsplit(Strng, ''), fill=0, byrow=TRUE) 
#  [,1] [,2] [,3] [,4] 
# [1,] "X" "D" "X" "0" 
# [2,] "G" "U" "V" "0" 
# [3,] "F" "Q" "0" "0" 
# [4,] "A" "C" "U" "E" 
# [5,] "H" "I" "T" "0" 
# [6,] "A" "Y" "X" "0" 
# [7,] "N" "F" "D" "0" 
# [8,] "A" "H" "B" "W" 
# [9,] "G" "K" "Q" "0" 
#[10,] "P" "Y" "F" "0" 

Или base R вариант будет (вариант, описанный в link)

read.fwf(file= textConnection(Strng), 
      widths = rep(1,max(nchar(Strng)))) 
+1

@RHertel Я исправлял это с помощью' byrow = TRUE'. Благодарю. – akrun

+0

Это работает! Спасибо. Задача решена. – kalinfirst

+1

с byrow = TRUE еще лучше, спасибо @RHertel – kalinfirst

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