2013-02-24 22 views
6

girişleri olan aşağıdaki formuBölünmüş dizeleri her dize sütunun bir potansiyel olarak farklı sayı

pages       count 
[page 1, page 2, page 3]  23 
[page 2, page 4]    4 
[page 1, page 3, page 4]  12 

Ve ne ben ilk sütunu bölünür yapmanız gereken var bir veri çerçevesi var Virgüllerde ve en uzun diziyi kapsayacak kadar yeni sütunlar oluşturun. boş bir sıfır uzunluklu dize ise

First Page  Second Page Third Page  Count 
page 1   page 2  page 3   23 
page 2   page 4  null   4 
page 1   page 3  page 4   12 

iyiyim, ben parantez kapalı sıyırma işleyebilir: sonucu olmalıdır. Biz myDat üzerinden pages indirebiliriz

cevap

3

örnek verileri

myDat <- read.table(text= 
    "pages|count 
[page 1, page 2, page 3]|23 
[page 2, page 4]|4 
[page 1, page 3, page 4]|12", header=TRUE, sep="|") 

üzerinde çalışmak.

# if factors, convert to characters 
pages <- as.character(myDat$page) 

# remove brackets. Note the double-escape's in R 
pages <- gsub("(\\[|\\])", "", pages) 

# split on comma 
pages <- strsplit(pages, ",") 

# find the largest element 
maxLen <- max(sapply(pages, length)) 

# fill in any blanks. The t() is to transpose the return from sapply 
pages <- 
t(sapply(pages, function(x) 
     # append to x, NA's. Note that if (0 == (maxLen - length(x))), then no NA's are appended 
     c(x, rep(NA, maxLen - length(x))) 
)) 

# add column names as necessary 
colnames(pages) <- paste(c("First", "Second", "Third"), "Page") 

# Put it all back together 
data.frame(pages, Count=myDat$count) 



Sonuçlar fill=TRUE ile

> data.frame(pages, Count=myDat$count) 
    First.Page Second.Page Third.Page Count 
1  page 1  page 2  page 3 23 
2  page 2  page 4  <NA>  4 
3  page 1  page 3  page 4 12 
+0

Ricardo biz usinf önce bu çözümü bir ön işleme gerek eklemek gerek olmadığı arar: Bu durumda ilgili fonksiyon concat.split ve aşağıdaki gibi ("myDat" seçeneğini kullanarak Ricardo'nun cevap itibaren) çalışır ayırıcı olarak mı? – agstudy

+0

@agstudy, ön işleme gerekmiyor. Kopyalama ve yapıştırma işlemini kolaylaştırmak için örnek verilere '|' ekledim, ancak aynı satırda (yani "read.table") yok olur. OP veri çerçevesine bir isim vermediğinden, “myDat” dedim. Hepsi kopyala + yapıştırılabilir olmalıdır. –

+0

Bu patlama. Teşekkürler! – TWAndrews

2

read.table bunları doldurabilir. names(DF2)<- hat ihmal edilebilir güzel sütun adları önemli değilse. Hiçbir paket kullanılmamaktadır.

> DF2 
    pages1 pages2 pages3 count 
1 page 1 page 2 page 3 23 
2 page 2 page 4    4 
3 page 1 page 3 page 4 12 

Not: bu olması önemli olsaydı Bu vs. page1, Sayfa2'ye, sütunları başlıkları verir kesin söz konusu gösterilen sütun başlıkları o yerini

# test data 

Lines <- "pages       count 
[page 1, page 2, page 3]  23 
[page 2, page 4]    4 
[page 1, page 3, page 4]  12" 

# code - replace text=Lines with something like "myfile.dat" 

DF <- read.table(text = Lines, skip = 1, sep = "]", as.is = TRUE) 
DF2 <- read.table(text = DF[[1]], sep = ",", fill = TRUE, as.is = TRUE) 
names(DF2) <- paste0(read.table(text = Lines, nrow = 1, as.is = TRUE)[[1]], seq_along(DF2)) 
DF2$count <- DF[[2]] 
DF2[[1]] <- sub(".", "", DF2[[1]]) # remove [ 

bu verir 20 sayfadan az sütun varsa, bu başlıkları kullanan satır.

ord <- c('First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth', 'Seventh', 
'Eighth', 'Ninth', 'Tenth', 'Eleventh', 'Twelfth', 'Thirteenth', 
'Fourteenth', 'Fiftheenth', 'Sixteenth', 'Seventeenth', 'Eighteenth', 
'Nineteenth') 
ix <- seq_along(DF2) 
names(DF2) <- if (ncol(DF2) < 20) paste(ord[ix], "Page") else paste("Page", ix) 
4

"splitstackshape" paketimin, bu tür bir sorunu gideren bir işlevi vardır. * | *

# Get rid of "[" and "]" from your "pages" variable 
myDat$pages <- gsub("\\[|\\]", "", myDat$pages) 
# Specify the source data.frame, the variable that needs to be split up 
# and whether to drop the original variable or not 
library(splitstackshape) 
concat.split(myDat, "pages", ",", drop = TRUE) 
# count pages_1 pages_2 pages_3 
# 1 23 page 1 page 2 page 3 
# 2  4 page 2 page 4   
# 3 12 page 1 page 3 page 4