2016-03-19 11 views
8

द्वारा डेटा फ्रेम में कॉलम गुणा करें, मैं जो करना चाहता हूं वह वेक्टर में पहले तत्व द्वारा डेटा.फ्रेम के कॉलम 1 में सभी मानों को गुणा करता है, फिर दूसरे तत्व द्वारा कॉलम 2 में सभी मानों को गुणा करें वेक्टर में, आदि ...वेक्टर

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) 

तो परिणाम यह है:

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

अगर मैं 100 कॉलम हैं मैं एक समय में यह एक स्तंभ पर क्या कर सकता है? मैं इस प्रोग्रामेटिक रूप से करने में सक्षम होना चाहता हूं।

+0

के तत्वों गुणा करने के लिए का उपयोग पूरे dataframe है सांख्यिक? – gung

+0

जिस समस्या पर मैं काम कर रहा हूं, उसके लिए संपूर्ण डेटा फ्रेम नहीं है। एक कारक कॉलम है। –

+2

आपको अपने उदाहरण में शामिल करना चाहिए ताकि लोग इसे ध्यान में रख सकें। – gung

उत्तर

5

डेटाफ्रेम कार्यों को स्थानांतरित करना।

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 

संपादित करें: सभी स्तंभ सांख्यिक नहीं हैं, तो आप निम्न

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

आपको कारक चर को खाते में ले जाना होगा। – gung

+0

यह मेरे 10 कॉलम, 1068 पंक्ति डेटा फ्रेम पर काम करता है। धन्यवाद! –

4

कर सकते हैं या बस, वेक्टर diagonalize ताकि प्रत्येक पंक्ति प्रविष्टि 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

हम भी वेक्टर लंबाई बराबर बनाने के लिए और करने के लिए दोहराने कर सकते हैं तो गुणा

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

या sweep

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

या mapply साथ 'data.frame' के लिए इसी के स्तंभों और 'वेक्टर'

mapply(`*`, d1, v1)