2016-03-19 25 views
8

Quello che voglio fare è moltiplicare tutti i valori nella colonna 1 di una data.frame dal primo elemento in un vettore, quindi moltiplicare tutti i valori nella colonna 2 dal secondo elemento nel vettore, ecc ...colonne Moltiplicare in un frame di dati da un vettore

c1 <- c(1,2,3) 
c2 <- c(4,5,6) 
c3 <- c(7,8,9) 
d1 <- data.frame(c1,c2,c3) 

    c1 c2 c3 
1 1 4 7 
2 2 5 8 
3 3 6 9 

v1 <- c(1,2,3) 

Così il risultato è questo:

c1 c2 c3 
1 1 8 21 
2 2 10 24 
3 3 12 27 

posso fare questo una colonna alla volta, ma cosa succede se ho 100 colonne? Voglio essere in grado di farlo a livello di programmazione.

+0

è l'intero dataframe numerico? – gung

+0

Non l'intero frame di dati per il problema su cui sto lavorando. C'è una colonna dei fattori. –

+2

Dovresti includerlo nel tuo esempio in modo che le persone possano tenerne conto. – gung

risposta

5

La trasposizione del dataframe funziona.

c1 <- c(1,2,3) 
c2 <- c(4,5,6) 
c3 <- c(7,8,9) 
d1 <- data.frame(c1,c2,c3) 
v1 <- c(1,2,3) 
t(t(d1)*v1) 
#  c1 c2 c3 
#[1,] 1 8 21 
#[2,] 2 10 24 
#[3,] 3 12 27 

EDIT: Se tutte le colonne non sono numerici, è possibile effettuare le seguenti operazioni

c1 <- c(1,2,3) 
c2 <- c(4,5,6) 
c3 <- c(7,8,9) 
d1 <- data.frame(c1,c2,c3) 

# Adding a column of characters for demonstration 
d1$c4 <- c("rr", "t", "s") 

v1 <- c(1,2,3) 

#Choosing only numeric columns 
index <- which(sapply(d1, is.numeric) == TRUE) 
d1_mat <- as.matrix(d1[,index]) 

d1[,index] <- t(t(d1_mat)*v1) 
d1 
# c1 c2 c3 c4 
#1 1 8 21 rr 
#2 2 10 24 t 
#3 3 12 27 s 
+0

Devi prendere in considerazione la variabile fattore. – gung

+0

Funziona sul mio 10 colonne, 1068 frame dati di riga. Grazie! –

4

O semplicemente diagonalizzare il vettore, in modo che ogni voce riga viene moltiplicato per il corrispondente elemento in v1:

c1 <- c(1,2,3) 
c2 <- c(4,5,6) 
c3 <- c(7,8,9) 
d1 <- as.matrix(cbind(c1,c2,c3)) 
v1 <- c(1,2,3) 

d1%*%diag(v1) 

    [,1] [,2] [,3] 
[1,] 1 8 21 
[2,] 2 10 24 
[3,] 3 12 27 
1

possiamo inoltre replicare il vettore per rendere le lunghezze uguali, e quindi moltiplicare

d1*v1[col(d1)] 
# c1 c2 c3 
#1 1 8 21 
#2 2 10 24 
#3 3 12 27 

Oppure utilizzare sweep

sweep(d1, 2, v1, FUN="*") 

O con mapply per moltiplicare le colonne corrispondenti 'data.frame' e gli elementi di 'vettore'

mapply(`*`, d1, v1) 
Problemi correlati