2011-11-02 10 views
9

Vorrei inserire un dataframe in pasta e vorrei incollarlo per trattarlo come se avessi inserito separatamente le colonne di quel dataframe. Il motivo per cui vorrei farlo è che non sono sicuro di quante colonne avrà il mio dataframe. Qui ha 2, ma mi piacerebbe una soluzione generale per affrontare qualsiasi numero di colonne.metodo paste per un dataframe

La mia uscita desiderata è test1paste nel seguente codice. Ma mi piacerebbe non dover fare riferimento alle colonne esplicitamente. Il mio tentativo apply fallisce comprensibilmente perché agisce individualmente sulle colonne, tuttavia penso che attraversi la soluzione che sto cercando.

> test1 <- 
+ structure(c(42.71, 41.69, 46.95, 48.85, 45.26, 44.71, 43.71, 
+ 42.69, 47.95, 49.85, 46.26, 45.71), .Dim = c(6L, 2L)) 
> 
> test1paste <- paste(test1[,1],test1[,2], sep = "&") 
> test1paste 
[1] "42.71&43.71" "41.69&42.69" "46.95&47.95" "48.85&49.85" "45.26&46.26" 
[6] "44.71&45.71" 
> 
> apply(test1,MARGIN=2,paste,sep="&") 
    [,1] [,2] 
[1,] "42.71" "43.71" 
[2,] "41.69" "42.69" 
[3,] "46.95" "47.95" 
[4,] "48.85" "49.85" 
[5,] "45.26" "46.26" 
[6,] "44.71" "45.71" 

Qualche idea?

Grazie!

+0

Questo ha qualcosa a che fare con LaTeX? –

+0

@Roman Sì, avete indovinato! Non sto usando 'xtable' perché voglio che gli errori standard vadano sotto le stime tra parentesi. –

+0

Mi leggi come un libro aperto. :) –

risposta

7

ne dite di questo:

> apply(test1,1,paste,collapse="&") 
[1] "42.71&43.71" "41.69&42.69" "46.95&47.95" "48.85&49.85" "45.26&46.26" 
[6] "44.71&45.71" 
+0

grazie è esattamente quello di cui ho bisogno. –

8

Se il "dataframe" è in realtà un data.frame (e non un matrix come nel tuo esempio), è possibile utilizzare do.call direttamente:

testdf <- as.data.frame(test1) 
do.call(paste, c(testdf, sep="&")) 

Questo si basa sul fatto che un data.frame è glorificato list e do.call prende un elenco di argomenti. Aggiungo semplicemente l'argomento sep all'elenco ...

Piccolo avvertimento però: se il nome di una colonna è "sep" o "collapse" potresti essere nei guai. La rimozione dei nomi delle colonne potrebbe essere utile in questo caso:

do.call(paste, c(unname(testdf), sep="&")) 
+0

grazie! Ho bisogno di imparare 'do.call' perché sembra estremamente utile. E mi scuso per aver usato una matrice come esempio senza essere esplicito a quale mi interessava. Grazie per la tua attenta soluzione. –