2015-10-14 10 views
5

Ho un df frame di dati per il report in formato RTF come:valore Skip in formato RTF segnalazione

df <- 

ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX 
Red  PPS  37201 75  3  1 
Red  PPS  37201 71  2  2 
Red  PPS  37201 73  2  1 
Red  PPS  38201 66  2  2 
Blue PPS  37201 78  3  2 
Blue PPS  38201 71  2  2 
Blue PPS  38201 71  2  1 
Blue PPS  38201 64  1  2 

voglio stampare come:

ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX 
Red  PPS  37201 75  3  1 
     PPS    71  2  2 
     PPS    73  2  1 
     PPS  38201 66  2  2 
Blue PPS  37201 78  3  2 
     PPS  38201 71  2  2 
     PPS    71  2  1 
     PPS    64  1  2 

Qualcuno mi può aiutare per favore.

+0

Hi akrun, grazie per il vostro aiuto. Potete per favore dare l'esempio solo per la variabile ATRSLBL. Mi aiuterà a capire meglio –

risposta

3

Ecco un modo con dplyr. Non sono sicuro che lo ATRSLBL sia un carattere o un fattore. La mia ipotesi è che sia un fattore. Innanzitutto, ho convertito ATRSLBL in caratteri. Quindi, ho sostituito i duplicati Red e Blue con "". Ho anche creato una variabile di gruppo utilizzando cumsum() nella prima parte di mutate(). Utilizzando la variabile di gruppo, ho raggruppato i dati e applicato replace() per CENTRE. Qui, sto dicendo a R se il numero di riga di ogni gruppo non è 1, sostituire qualsiasi carattere a "". Quindi, mantieni le informazioni nella prima riga di ogni gruppo. Quindi, si separano i dati e si elimina la variabile di gruppo utilizzando select(). Spero che questo ti possa aiutare.

library(dplyr) 
mutate(mydf, 
     ATRSLBL = replace(as.character(ATRSLBL), which(duplicated(ATRSLBL) == TRUE), ""), 
     group = cumsum(c(T, abs(diff(CENTRE)) > 1))) %>% 
group_by(group) %>% 
mutate(CENTRE = replace(CENTRE, which(row_number(CENTRE) != 1), "")) %>% 
ungroup %>% 
select(-group) 

# ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX 
# (chr) (fctr) (chr) (int) (int) (int) 
#1  Red PPS 37201 75  3  1 
#2   PPS   71  2  2 
#3   PPS   73  2  1 
#4   PPS 38201 66  2  2 
#5 Blue PPS 37201 78  3  2 
#6   PPS 38201 71  2  2 
#7   PPS   71  2  1 
#8   PPS   64  1  2 

DATI

mydf <- structure(list(ATRSLBL = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L), .Label = c("Blue", "Red"), class = "factor"), POPUL = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "PPS", class = "factor"), 
CENTRE = c(37201L, 37201L, 37201L, 38201L, 37201L, 38201L, 
38201L, 38201L), BAGE = c(75L, 71L, 73L, 66L, 78L, 71L, 71L, 
64L), BAGEC1 = c(3L, 2L, 2L, 2L, 3L, 2L, 2L, 1L), SEX = c(1L, 
2L, 1L, 2L, 2L, 2L, 1L, 2L)), .Names = c("ATRSLBL", "POPUL", 
"CENTRE", "BAGE", "BAGEC1", "SEX"), class = "data.frame", row.names = c(NA, 
-8L)) 
+0

Grazie @jazzurro. È davvero utile. –

+0

@AbuNoman Piacere. :) – jazzurro

+0

Puoi dirmi se CENTRO è un personaggio, allora quale sarebbe la procedura. Grazie. –

3

Possiamo farlo con data.table. Convertiamo 'data.frame' in 'data.table' (setDT(df)), otteniamo l'indice logico di duplicated 'ATRSLBL' e assegniamo (:=) a ''. Creiamo la variabile di raggruppamento (cumsum(ATRSLBL !='')), e ottenere l'indice di riga duplicated 'CENTRO', utilizziamo tale indice assegnare 'CENTRO' a '' dopo la conversione colonna 'CENTRO' a 'carattere'

library(data.table) 
setDT(df)[duplicated(ATRSLBL), ATRSLBL := ''] 
i1 <- df[, .I[duplicated(CENTRE)] , cumsum(ATRSLBL!='')]$V1 
df[, CENTRE:= as.character(CENTRE)][i1, CENTRE:= ''] 
df 
# ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX 
#1:  Red PPS 37201 75  3 1 
#2:   PPS   71  2 2 
#3:   PPS   73  2 1 
#4:   PPS 38201 66  2 2 
#5: Blue PPS 37201 78  3 2 
#6:   PPS 38201 71  2 2 
#7:   PPS   71  2 1 
#8:   PPS   64  1 2 

NOTA: Qui sto assumendo la colonna 'ATRSLBL' come classe character.

+0

@Pascal Sì, hai ragione. Ho usato un altro earlie di dati – akrun

+0

Grazie a @akrun. È davvero utile. –