आर

2012-10-11 7 views
17

में डेटाफ्रेम में मूल्यों को तेजी से बदलना मेरे पास 150,000 पंक्तियों का डेटा फ्रेम है जिसमें मूल्यों वाले 2,000 कॉलम हैं, कुछ नकारात्मक हैं। मैं उन नकारात्मक मानों को 0 से बदल रहा हूं, लेकिन ऐसा करने में बहुत धीमा है (~ 60min या अधिक)।आर

df[df < 0] = 0

जहां df[,1441:1453] तरह लग रहा है (सभी स्तंभों/संख्यात्मक मान):

V1441 V1442 V1443 V1444 V1445 V1446 V1447 V1448 V1449 V1450 V1451 V1452 V1453 
1  3  1  0  4  4 -2  0  3 12  5 17 34 27 
2  0  1  0  7  0  0  0  1  0  0  0  0  0 
3  0  2  0  1  2  3  6  1  2  1 -6  3  1 
4  1  2  3  6  1  2  1 -6  3  1 -4  1  0 
5  1  2  1 -6  3  1 -4  1  0  0  1  0  0 
6  1  0  0  1  0  0  0  0  0  0  1  2  2 

ऐसी प्रक्रिया में तेजी लाने के लिए एक रास्ता पूरी तरह से धीमी गति से है, जैसे तरह से मैं यह कर रहा हूँ है, और इसके लिए तेज दृष्टिकोण है? धन्यवाद।

+0

150,000 पंक्तियां x 2000 कॉलम कुंजी मान के लिए संदर्भ द्वारा की जगह सेट कर सकते हैं: यह सही है –

+0

कर सकते हैं आप कृपया [हमें दिखा] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) आपका डेटा कैसा दिखता है? क्या सभी कॉलम संख्यात्मक हैं? – Roland

उत्तर

29

अपने डीएफ को एक मैट्रिक्स में बदलने का प्रयास करें।

df <- data.frame(a=rnorm(1000),b=rnorm(1000)) 
m <- as.matrix(df) 
m[m<0] <- 0 
df <- as.data.frame(m) 
+0

अधिक। काफी तेज ! धन्यवाद –

+0

वास्तव में वास्तव में तेज़! –

21

अपने मूल दृष्टिकोण दोनों और एक वस्तु m (या df) के रूप में एक ही आकार बनाने के वर्तमान जवाब जब m<0 बनाने (मैट्रिक्स दृष्टिकोण तेज है [<-[<-.data.frame

के साथ तुलना के साथ कम आंतरिक नकल न होने के कारण

आप lapply और replace उपयोग कर सकते हैं, तो आप केवल एक वेक्टर या length (nrow(df)) हर बार को देख रहे हैं और इतना

नकल नहीं

उपर्युक्त कोड काफी प्रभावशाली होना चाहिए।

यदि आप data.table का उपयोग करते हैं, तो data.frame दृष्टिकोण की अधिकांश स्मृति (और) समय अक्षमता हटा दी जाती है। यह आपके जैसी बड़ी डेटा स्थिति के लिए आदर्श होगा।

library(data.table) 
# this really shouldn't be 
DT <- lapply(df, function(x){replace(x, x <0,0)}) 
# change to data.table 
setattr(DT, 'class', c('data.table','data.frame')) 
# or 
# DT <- as.data.table(df, function(x){replace(x, x <0,0)}) 

आप सभी स्तंभों पर कुंजी और उसके बाद कम से कम 0