2014-06-30 12 views
7

Ho un set di dati che ha date e tassi di interesse nella stessa colonna. Ho bisogno di dividere questi due numeri in due colonne separate, tuttavia quando uso il codice seguente:R - Utilizzo di str_split e unlist per creare due colonne

Split <- str_split(df$Dates, "[ ]", n = 2) 
Dates <- unlist(Split)[1] 
Rates <- unlist(Split)[2] 

Esso restituisce solo il primo "valore" di ciascun elemento, cioè, "1971/04/01" per Date e "7.43" per le tariffe. Mi serve per ripristinare tutti i valori per la porzione di stringa divisa e lo stesso per la seconda porzione della stringa diviso

seguito è una parte di set di dati, righe totale = 518.

1971-04-01 7.31 
    1971-05-01 7.43 
    1971-06-01 7.53 
    1971-07-01 7.60 
    1971-08-01 7.70 
    1971-09-01 7.69 
    1971-10-01 7.63 
    1971-11-01 7.55 
    1971-12-01 7.48 
    1972-01-01 7.44 

Grazie

risposta

6

Potrebbe fare

Split <- strsplit(as.character(df$Dates), " ", fixed = TRUE) 
Dates <- sapply(Split, "[", 1) 
Rates <- sapply(Split, "[", 2) 
+0

questo ha funzionato perfettamente, anche se ho dovuto usare 4 per i tassi, a causa di essa raccogliendo 4 divisioni separate.Quando ho usato str_split, sono stato in grado di specificare il numero di divisioni effettive da fare, se non lo avessi raccolto lo stesso numero di split. Grazie! –

0

Prova questo:

Split <- c("1971-06-01 7.53", "1971-05-01 7.43", "1971-06-01 7.53") 
df <- unlist(str_split(string = Split, pattern = "\\s")) 
df 
1

anche:

Split <- c("1971-06-01 7.53", "1971-05-01 7.43", "1971-06-01 7.53") 

tuo codice seleziona solo la prima osservazione.

Str <- unlist(str_split(Split, "[ ]", n=2)) 
Str[1] 
#[1] "1971-06-01" 

Se si guarda alla output di non elencati (..), le date sono seguiti da valori. Quindi, puoi usare un indice logico.

Str[c(T,F)] 
#[1] "1971-06-01" "1971-05-01" "1971-06-01" 

as.numeric(Str[c(F,T)]) 
#[1] 7.53 7.43 7.53 

È possibile convertire in due colonne di una dataframe da Split utilizzando read.table

read.table(text=Split, header=F, sep="",stringsAsFactors=F) 
#   V1 V2 
# 1 1971-06-01 7.53 
# 2 1971-05-01 7.43 
# 3 1971-06-01 7.53 
+0

+1. Personalmente uso il trucco 'read.table' un bel po 'e l'ho usato nel mio pacchetto" splitstackshape ". Tuttavia, poiché ci sono opzioni più veloci di 'read.table', ho giocato con la creazione di diverse funzioni, come [' cSplit'] (https://gist.github.com/mrdwab/11380733) e ['concat .split.DT'] (https://gist.github.com/mrdwab/6873058). – A5C1D2H2I1M1N2O1R2T1

+0

Grazie 'Ananda Mahto' per le funzioni. Sarebbe meglio avere 'cSplit' in un pacchetto. – akrun

+0

È pianificato: non è stato possibile testare se tutto sembra davvero OK per il suo invio al pacchetto "splitstackshape". :-) – A5C1D2H2I1M1N2O1R2T1

2

Utilizzando i dati di @ user2583119 (si prega di inviare il codice riproducibili minima tra cui un set di dati):

library(qdap) 
colsplit2df(data.frame(Split), sep = " ") 

##   X1 X2 
## 1 1971-06-01 7.53 
## 2 1971-05-01 7.43 
## 3 1971-06-01 7.53 
2

È possibile utilizzare reshape2::colsplit

library(reshape2) 
colsplit(df$Dates, ' ', names = c('Dates','Rates')) 
#   Dates Rates 
# 1 1971-04-01 7.31 
# 2 1971-05-01 7.43 
# 3 1971-06-01 7.53 
# 4 1971-07-01 7.60 
# 5 1971-08-01 7.70 
# 6 1971-09-01 7.69 
# 7 1971-10-01 7.63 
# 8 1971-11-01 7.55 
# 9 1971-12-01 7.48 
# 10 1972-01-01 7.44 
+0

@akrun buon punto, e cambiato. – mnel

2

Forse sono di parte, ma suggerirei my cSplit function per questo problema.

In primo luogo, sto assumendo che stiamo iniziando con la seguente (singola colonna) data.frame (dove ci sono più spazi tra il valore "data" e il valore "rate").

df <- data.frame(
    Date = c("1971-04-01 7.31", "1971-05-01 7.43", "1971-06-01 7.53", 
      "1971-07-01 7.60", "1971-08-01 7.70", "1971-09-01 7.69", 
      "1971-10-01 7.63", "1971-11-01 7.55", "1971-12-01 7.48", 
      "1972-01-01 7.44")) 

Avanti, get the cSplit function from my GitHub Gist, e usarlo. Puoi dividere su un'espressione regolare (qui, più spazi).

cSplit(df, "Date", "\\s+", fixed = FALSE) 
#   Date_1 Date_2 
# 1: 1971-04-01 7.31 
# 2: 1971-05-01 7.43 
# 3: 1971-06-01 7.53 
# 4: 1971-07-01 7.60 
# 5: 1971-08-01 7.70 
# 6: 1971-09-01 7.69 
# 7: 1971-10-01 7.63 
# 8: 1971-11-01 7.55 
# 9: 1971-12-01 7.48 
# 10: 1972-01-01 7.44 

Dal momento che la funzione converte un data.frame ad un data.table, si ha accesso a setnames che avrebbe permesso di rinominare le colonne in luogo.

setnames(cSplit(df, "Date", "\\s+", fixed = FALSE), c("Dates", "Rates"))[] 
#   Dates Rates 
# 1: 1971-04-01 7.31 
# 2: 1971-05-01 7.43 
# 3: 1971-06-01 7.53 
# 4: 1971-07-01 7.60 
# 5: 1971-08-01 7.70 
# 6: 1971-09-01 7.69 
# 7: 1971-10-01 7.63 
# 8: 1971-11-01 7.55 
# 9: 1971-12-01 7.48 
# 10: 1972-01-01 7.44 
+0

In realtà ho finito per usare un concat.split perché dovevo farlo per numerosi file di un simile set-up. Mi sono imbattuto in errori dovuti a lievi problemi di spaziatura dai file; niente come i set di dati del governo per essere pulito e facile da usare. –

0
df <- data.frame(
Date = c("1971-04-01 7.31", "1971-05-01 7.43", "1971-06-01 7.53", 
     "1971-07-01 7.60", "1971-08-01 7.70", "1971-09-01 7.69", 
     "1971-10-01 7.63", "1971-11-01 7.55", "1971-12-01 7.48", 
     "1972-01-01 7.44")) 

do.call(rbind, strsplit(as.character(df$Date), split = '\\s+', fixed = FALSE)) 
+0

si prega di dare più chiarimenti.ferificare questo http://stackoverflow.com/help/how-to-answer – IsuruAb

Problemi correlati