2011-02-23 13 views
8

मुझे क्या करना चाहते हैं शर्मनाक सरल है के साथ - फिर भी मैं असफल।एक data.frame की प्रत्येक कोशिका गुणा यह वजन

मैं "वर्ण" और "numerics" के साथ एक data.frame है। डेटा.फ्रेम के कॉलम में से एक वजन का प्रतिनिधित्व करता है।

मैं (अगर यह एक अंकीय है) इसी वजन के साथ डेटा फ्रेम की हर कोशिका गुणा करने के लिए चाहते हैं।

मैं ऐसा कैसे है कि (सबसे अच्छा एक नेस्टेड लूप का उपयोग किए बिना)।

अग्रिम धन्यवाद!

उदाहरण:

c1 c2 w 
l1 abc 2 1 
l2 dxf 3 0.5 
l3 ghi 4 1.5 

c1 c2 w 
l1 abc 2 1 
l2 dxf 1.5 0.5 
l3 ghi 6 1.5 

उत्तर

6

एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के लिए, dd वैरिएबल प्रकार का एक मिश्रण के साथ एक डेटा फ्रेम है, W जा रहा है वजन के साथ।

dd <- data.frame(G=gl(2,2), X=rnorm(4), Y=1L:4L, Z=letters[1:4], W=0.3:3.3) 
num.vars <- names(dd)[sapply(dd, is.numeric)] #select numeric variables 
num.vars <- setdiff(num.vars, "W") # remove the weight variable 
dd[num.vars] <- dd[num.vars] * dd$W # multiply 
+0

में इसका उल्लेख नहीं किया यह शानदार दिखता है! – speendo

+0

संख्यात्मक कॉलम निकालने और फिर उन्हें पुन: सम्मिलित करने के लिए उत्कृष्ट तकनीक। धन्यवाद! – drbv

5

Vectorise हो जाना चाहिए!

> dat <- data.frame(c1 = c("abc","dxf","ghi"), c2 = 2:4, w = c(1,0.5,1.5)) 

प्रभावी रूप से, आप c2 * w चाहते, लेकिन हम आर बताने के लिए अंदर देखने के लिए डेटा फ्रेम की जरूरत है:

> with(dat, c2 * w) 
[1] 2.0 1.5 6.0 

कौन सा हम एक पंक्ति में dat में वापस डाल सकते हैं:

> dat <- within(dat, c3 <- c2 * w) 
> dat 
    c1 c2 w c3 
1 abc 2 1.0 2.0 
2 dxf 3 0.5 1.5 
3 ghi 4 1.5 6.0 

(c2 साथ c3 बदलें अगर आप मौजूदा 01 अधिलेखित करना चाहते हैं।)

यदि आपके वजन के अलावा एक से अधिक संख्यात्मक कॉलम हैं, तो यदि आप इसे स्वचालित करना चाहते हैं तो एक छोटी सी रणनीति की आवश्यकता होती है (यानी। आर को नहीं बताएं कि कौन से कॉलम w से गुणा करें)।

> ## dummy data 
> dat2 <- data.frame(c1 = c("abc","dxf","ghi"), c2 = 2:4, w = c(1,0.5,1.5), 
        c3 = 5:7, c4 = 3:5) 
> ## select the columns we want, all numerics, but not `w` 
> want <- sapply(dat2, is.numeric) & names(dat2) != "w" 
> ## then use want to index into dat2 
> dat2[, want] <- with(dat2, dat2[, want] * w) 
> dat2 
    c1 c2 w c3 c4 
1 abc 2.0 1.0 5.0 3.0 
2 dxf 1.5 0.5 3.0 2.0 
3 ghi 6.0 1.5 10.5 7.5 
+0

धन्यवाद! मुझे पता है कि यह काम करेगा, लेकिन मेरे पास लगभग 200 कॉलम हैं, इसलिए मैं उन सभी गुणाओं को हाथ से नहीं कर सकता।लेकिन मुझे लगता है कि इसे लागू करने या फोरैच-लूप के साथ ऐसा करने का एक तरीका होगा ... – speendo

+1

@ मार्सेल मैंने प्रारंभ में क्यू के कई कॉलम हिस्से को नहीं देखा - मैंने कई स्तंभों के लिए एक ही चीज़ करने का एक उदाहरण जोड़ा जबकि आप अपनी टिप्पणी लिख रहे थे। –

+0

मेरी गलती - मैंने अपने प्रारंभिक प्रश्न – speendo

2

खुशी एक पंक्ति में इसे बनाने के लिए प्रयास करने के लिए बस के लिए (लेकिन अधिकांश पठनीय वास्तव में नहीं है!):

R> dd <- data.frame(G=gl(2,2), X=rnorm(4), Y=1L:4L, Z=letters[1:4], W=0.3:3.3) 
R> dd 
    G   X Y Z W 
1 1 0.2319565 1 a 0.3 
2 1 0.4242205 2 b 1.3 
3 2 0.5218064 3 c 2.3 
4 2 0.7155944 4 d 3.3 

R> data.frame(lapply(subset(dd, select=-W), function(v, w=dd$W) { if (is.numeric(v)) v*w else v }), W=dd$W) 
    G   X Y Z W 
1 1 0.06958695 0.3 a 0.3 
2 1 0.55148670 2.6 b 1.3 
3 2 1.20015475 6.9 c 2.3 
4 2 2.36146163 13.2 d 3.3 
+0

मैंने इसे किसी तरह की कोशिश की, लेकिन मैं असफल रहा! मैं इसे बहुत सावधानी से देखूंगा! :) – speendo

1

आप देखा है, वहाँ कई तरीके से ऐसा करने के लिए, लेकिन किसी भी तरह से आप एक वास्तव में सरल तरीका की उम्मीद करेंगे और मुझे नहीं पता कि यह मौजूद है या नहीं। कॉलरवाइज नामक प्लीयर पैकेज में एक लाइब्रेरी फ़ंक्शन है जो करीब है, लेकिन मैं इसे ठीक से करने के लिए एक साफ तरीके से नहीं आ सकता हूं। सबसे अच्छा मैं colwise wtih क्या कर सकते हैं यह (यह मानते हुए अपने dataframe नाम पर है df) है:

w2<-df$w df<-colwise(function(x,w){if(is.numeric(x)){x*w} else{x}})(df,df$w) df$w<-w2

जो लोग colwise से परिचित हैं के लिए, मुझे नहीं लगता कि आप बस numcolwise का उपयोग कर सकते हैं, क्योंकि तब गैर सांख्यिक स्तंभ बिल्कुल उत्सर्जित नहीं हैं। और मैं वजन के लिए सेब गुणा करने के लिए कोई साफ तरीका नहीं समझ सकता, इसलिए मैं इसे यहां सहेजता हूं और इसे पुनर्स्थापित करता हूं। मुझे लगता है कि अगर ऐसा करने का एक क्लीनर तरीका काम किया जा सकता है, तो कॉलवाई एक अच्छा सिम्प्ले और ऐसा करने के तरीके को समझने में आसान है।

+0

धन्यवाद! मैंने वास्तव में सोचा कि एक साधारण आदेश था जो सब कुछ करेगा, लेकिन कभी भी बुरा मत मानो, कम से कम मैंने कुछ सीखा ... – speendo

संबंधित मुद्दे