2013-09-16 7 views
7

के साथ मैट्रिक्स पर लागू फ़ंक्शन का उपयोग करके मैंने एक सीएसवी फ़ाइल से डेटा पढ़ा। अगर मैं आर में इस फ़ाइल को देखते हैं, मेरे पास है:NA प्रविष्टियों

V1 V2 V3 V4 V5 V6 V7 
1 14 25 83 64 987 45 78 
2 15 65 789 32 14 NA NA 
3 14 67 89 14 NA NA NA 

अगर मैं प्रत्येक स्तंभ में अधिकतम मूल्य चाहते हैं, मैं इस का उपयोग करें:

apply(df,2,max) 

और इस परिणाम है:

V1 V2 V3 V4 V5 V6 V7 
15 67 789 64 NA NA NA 

लेकिन यह उस कॉलम पर काम करता है जिसमें NA नहीं है। NA के साथ कॉलम की तुलना करने के लिए मैं अपना कोड कैसे बदल सकता हूं?

उत्तर

17

आपको बस अपने आवेदन कॉल में na.rm=TRUE जोड़ने की आवश्यकता है।

apply(df,2,max,na.rm=TRUE) 

नोट: यह मानता है कि प्रत्येक कॉलम में कम से कम एक डेटा बिंदु होता है। यदि कोई sum0 वापस नहीं करेगा।

टिप्पणी संपादित करें

fft के आधार पर एक na.rm तर्क नहीं है। इसलिए, आपको अपना स्वयं का कार्य लिखना होगा।

apply(df,2,function(x){fft(x[!is.na(x)])}) 

उदाहरण के लिए:

df <- data.frame(matrix(5,5,5)) 
df[,3] <- NA 

> df 
    X1 X2 X3 X4 X5 
1 5 5 NA 5 5 
2 5 5 NA 5 5 
3 5 5 NA 5 5 
4 5 5 NA 5 5 
5 5 5 NA 5 5 

> apply(df,2,function(x){fft(x[!is.na(x)])}) 
$X1 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 

$X2 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 

$X3 
complex(0) 

$X4 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 

$X5 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 
+0

अपने जवाब के लिए धन्यवाद, लेकिन कर रहे हैं मैं 'का उपयोग लागू (df, 2, fft, na.rm = TRUE)' मुझे एक त्रुटि मिलती है: 'FUN में त्रुटि (newX [, i], ...): अप्रयुक्त तर्क (na.rm = TRUE)' ऐसा लगता है कि यह एफएफटी के साथ काम नहीं कर रहा है (अधिकतम जैसे अन्य, ...) यह ठीक काम करता है – TangoStar

+1

'लागू करें 'पर देखो: FUN के बाद तर्क (जैसे' अधिकतम' या' fft') को FUN में पास कर दिया जाता है। और 'fft' में 'na.rm' पैरामीटर नहीं है, इसलिए आपको एक त्रुटि मिलती है। आप पहले कॉलम पर 'na.omit()' का उपयोग कर सकते हैं, और फिर 'fft'। – ROLO

+0

शुक्रिया धन्यवाद :) मैं इसे() के साथ कैसे कार्यान्वित कर सकता हूं? – TangoStar

5

एक अन्य विकल्प:

sapply(apply(df,2,na.exclude), fft) 

संपादित करें: यदि apply() एक सूची के बजाय एक मैट्रिक्स रिटर्न कोड ऊपर विफल हो सकता है। और ऐसा होगा यदि उदाहरण के लिए NA एस नहीं है। नीचे दिए गए कोड को ठीक करता है कि:

sapply(tapply(m, col(m), na.exclude), max) 

दिलचस्प है, वहाँ simplify=FALSE स्थापित करने के लिए कोई जरूरत नहीं है, tapply() का परिणाम अगर na.exclude() स्तंभ प्रति एक भी अदिश रिटर्न केवल सरल बनाया जाएगा के रूप में; और इस मामले में sapply उसी तरह काम करता है।

1

एक अन्य विकल्प, इस -Inf वापस आ जाएगी अगर col के सभी तत्वों को एनए

df<-structure(list(x = c(10, 12, 13), y = c(12, 13, NA), z = c(NA_real_, 
NA_real_, NA_real_)), .Names = c("x", "y", "z"), row.names = c(NA, 
-3L), class = "data.frame") 

kk<-Map(function(x) max(na.omit(df[,x])),as.list(names(df))) 
ll<-do.call(rbind,kk) 
rownames(ll)<-names(df) 

> ll 

[,1] 
x 13 
y 13 
z -Inf 
संबंधित मुद्दे