2013-02-24 6 views
6

Mam ramki danych, który ma następującą postaćdzielona struny na kolumny w R, gdzie każdy łańcuch ma potencjalnie inna liczba kolumnie Wpisy

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

i co muszę zrobić, to podzielić pierwszą kolumnę na przecinkach i stwórz wystarczającą liczbę nowych kolumn, aby objąć najdłuższą sekwencję. Wynik powinien być:

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 

jestem w porządku, jeśli zerowa jest ciągiem o zerowej długości, a ja mogę poradzić zdzierając wsporniki.

Odpowiedz

3

przykładowe dane

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="|") 

Możemy wyciągnąć pages z myDat do pracy nad nią.

# 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) 



Wyniki

> 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 wygląda, że ​​musimy się przetwarzaniem wstępnym przed usinf tego rozwiązania, czy trzeba dodać * | * jako separator? – agstudy

+0

@agstudy, bez konieczności wstępnego przetwarzania. Dodałem '|' do przykładowych danych, aby ułatwić kopiowanie i wklejanie, ale znika ono w tej samej linii (np. Przez 'read.table'). Ponieważ OP nie nadał nazwy ramie danych, nazwałem ją 'myDat'. Powinny być kopiowane i wklejane. –

+0

To jest bang. Dzięki! – TWAndrews

2

read.table z fill=TRUE może wypełnić je. Linia names(DF2)<- mogą być pominięte, jeśli ładne nazwy kolumn nie są ważne. Żadne pakiety nie są używane.

# 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 [ 

co daje to:

> 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 

Uwaga: Daje kolumn nagłówki Strona1, page2 itp Gdyby to było ważne, aby mieć dokładnie nagłówki kolumn pokazane na pytanie, które następnie zastąpić linia z tym, która używa tych nagłówków, jeśli jest mniej niż 20 kolumn strony.

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

Mój pakiet "splitstackshape" ma funkcję, która rozwiązuje ten problem. Odpowiednia funkcja w tym przypadku jest concat.split i działa w następujący sposób (używając „myDat” z odpowiedzią Ricarda):

# 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 
Powiązane problemy