2010-06-18 4 views
24

मैं डेटाफ्रेम (df) में एक चर (कॉलम) जोड़ना चाहता हूं, जिसमें प्रत्येक पंक्ति में 2 से 26 वें कॉलम में उस पंक्ति का अधिकतम मान शामिल है।प्रत्येक पंक्ति के अधिकतम मान वाले डेटा फ्रेम में एक चर जोड़ें

पहली पंक्ति के लिए, कोड होगा:

df$max[1] <- max(df[1,2:26]) 

मैं एक तरह से 865. के लिए पंक्तियों 1 के लिए कि सामान्यीकरण करने के लिए देख रहा हूँ अगर मैं दे:

df$max[1:865] <- max(df[1:865, 2:26]) 

मैं परिवर्तनीय df$max के लिए सभी पंक्तियों में कुल मिलाकर अधिकतम।

उत्तर

29

आप apply का उपयोग कर सकते हैं। उदाहरण के लिए:

> df <- data.frame(a=1:50, b=rnorm(50), c=rpois(50, 10)) 
> df$max <- apply(df, 1, max) 
> head(df, 2) 
    a   b c max 
1 1 1.3527115 9 9 
2 2 -0.6469987 20 20 
> tail(df, 2) 
    a   b c max 
49 49 -1.4796887 10 49 
50 50 0.1600679 13 50 
+1

क्या अगर मैं अधिकतम में स्तंभ का नाम चाहते हैं प्रत्येक पंक्ति के लिए .. उदाहरण के लिए डीएफ $ अधिकतम [1] = सी – syllogismos

+1

क्या होगा यदि मुझे na.rm = TRUE जोड़ने की आवश्यकता है? – KillerSnail

23
pmax साथ

vectorized संस्करण:

df$max <- do.call(pmax, df[2:26]) 
+1

+1 pmax फ़ंक्शन के बारे में भूल गए। – Shane

+0

इसके लिए बहुत बहुत धन्यवाद। –

0

एक और अविश्वसनीय रूप से तेजी से विधि max.col साथ मैट्रिक्स निष्कर्षण [ गठबंधन करने के लिए है, जो एक रिटर्न

df[, "max"] <- apply(df[, 2:26], 1, max) 

यहाँ एक बुनियादी उदाहरण है वेक्टर प्रत्येक पंक्ति में अधिकतम मूल्य की कॉलम स्थिति अनुक्रमणित करता है।

df$max <- df[2:26][cbind(seq_len(nrow(df)), max.col(df[2:26]))] 

cbind एक मैट्रिक्स प्रत्येक पंक्ति के लिए अधिकतम मूल्य की स्थिति का अनुक्रमण निर्माण करती है और [ इस का उपयोग करता है यह मान प्राप्त करने के।


चलिए कुछ बेंचमार्किंग करते हैं।

# data.frame with 1000 observations and 26 variables 
set.seed(1234) 
df <- data.frame(id=paste0(letters[-1], 1:40), matrix(rnorm(25000L, 5L, 10L), 1000L)) 

इसके अलावा मिश्रण करने के लिए matrixStats पैकेज से rowMaxs समारोह जोड़ें।

library(matrixStats) 
library(microbenchmark) 

microbenchmark(apply=apply(df[, 2:26], 1, max), 
       pmax=do.call(pmax, df[2:26]), 
       max.colSub=df[2:26][cbind(seq_len(nrow(df)), max.col(df[2:26]))], 
       rowMaxs=rowMaxs(as.matrix(df[2:26]))) 
Unit: microseconds 
     expr  min  lq  mean median  uq  max neval cld 
     apply 1610.540 1786.5905 2193.5334 1863.5680 1990.4380 6915.999 100 c 
     pmax 354.382 364.6455 380.1720 373.3405 385.4580 567.923 100 a 
    max.colSub 604.416 651.7430 822.6015 664.7155 681.2510 3086.512 100 b 
    rowMaxs 243.762 264.0040 320.2350 277.9750 290.5190 2328.712 100 a 

तो, rowMaxs स्पष्ट विजेता pmax द्वारा और फिर max.col द्वारा पीछा किया, मैट्रिक्स निष्कर्षण के साथ, और apply पैक 'के अंत में है।

10000 पंक्तियों और 26 कॉलम के साथ एक data.frame साथ

, हम इसी तरह की कहानी मिलती है:

set.seed(1234) 
df <- data.frame(id=paste0(letters[-1], 1:400), matrix(rnorm(250000L, 5L, 10L), 10000L)) 

ऊपर कोड लौटाता है

Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval cld 
     apply 15.193361 18.299830 21.737516 20.337880 21.774793 99.44836 100 c 
     pmax 3.060853 3.101481 3.156630 3.137545 3.191430 3.54182 100 a 
max.colSub 3.338828 3.642603 7.051700 3.992708 6.336531 84.43119 100 b 
    rowMaxs 1.244184 1.322302 2.675281 1.508474 1.638053 79.28054 100 a 
संबंधित मुद्दे