2016-03-19 20 views
8

Was ich tun möchte, ist, alle Werte in Spalte 1 eines data.frame mit dem ersten Element in einem Vektor zu multiplizieren, dann alle Werte in Spalte 2 mit dem zweiten Element zu multiplizieren in den Vektor, etc ...Multiplizieren Sie Spalten in einem Datenrahmen mit einem Vektor

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) 

So ist das Ergebnis folgendermaßen aus:

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

ich kann diese eine Spalte zu einem Zeitpunkt tun, aber was ist, wenn ich 100 Spalten haben? Ich möchte das programmatisch machen können.

+0

Ist der gesamte Datenrahmen zu multiplizieren, numerisch? – gung

+0

Nicht der gesamte Datenrahmen für das Problem, an dem ich arbeite. Es gibt eine Faktorspalte. –

+2

Sie sollten das in Ihrem Beispiel angeben, damit die Leute es berücksichtigen können. – gung

Antwort

5

Das Transponieren des Datenrahmens funktioniert.

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: Wenn alle Spalten nicht numerisch sind, können Sie die folgende

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

Sie müssen die Faktorvariable berücksichtigen. – gung

+0

Das funktioniert auf meinem 10-Spalte, 1068 Zeile Datenrahmen. Vielen Dank! –

4

Oder einfach den Vektor diagonalisieren, so dass jede Zeile Eintrag mit dem entsprechenden Element in v1 multipliziert:

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

Wir haben auch den Vektor replizieren können die Längen gleich und dann zu machen, multiplizieren

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

Nutzen sweep

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

oder mapply den entsprechenden Spalten von 'data.frame' und die Elemente der 'Vektor'

mapply(`*`, d1, v1) 
Verwandte Themen