r - क्या ऑपरेटर में एनए वैल्यू को छोड़ना संभव है?




vector sum (4)

मैं आर में एक समीकरण की गणना करना चाहता हूं। मैं फ़ंक्शन sum का उपयोग नहीं करना चाहता क्योंकि वह 1 मान लौटा रहा है I मुझे मूल्यों का पूर्ण वैक्टर चाहिए

x = 1:10
y = c(21:29,NA)
x+y
 [1] 22 24 26 28 30 32 34 36 38 NA

x = 1:10
y = c(21:30)
x+y
 [1] 22 24 26 28 30 32 34 36 38 40

मुझे नहीं चाहिए:

sum(x,y, na.rm = TRUE)
[1] 280

जो एक वेक्टर वापस नहीं करता है

यह एक खिलौना उदाहरण है, लेकिन मेरे पास 84647 लम्बाई वाले कई वेक्टर का उपयोग करते हुए अधिक जटिल समीकरण हैं।

मेरा क्या मतलब है इसका एक और उदाहरण है:

x = 1:10
y = c(21:29,NA)
z = 11:20
a = c(NA,NA,NA,30:36)
5 +2*(x+y-50)/(x+y+z+a) 
 [1]       NA       NA       NA 4.388889 4.473684 4.550000 4.619048 4.681818 4.739130       NA

आप ifelse() उपयोग कर सकते हैं

x = 1:10
y = c(21:29,NA)
x+y

[1] 22 24 26 28 30 32 34 36 38 NA

x + ifelse(is.na(y), 0, y)

[1] 22 24 26 28 30 32 34 36 38 10

सिर्फ प्रशंसकों के लिए:

x=1:10
y=c(21:29, NA)

"[<-"(x, is.na(x), 0) + "[<-"(y, is.na(y), 0)
# [1] 22 24 26 28 30 32 34 36 38 10

जो फिर से इस तथ्य को दिखाता है कि आर में सब कुछ एक समारोह है (और यह भी दिखाता है कि आर इंटरप्रेटर पर्याप्त रूप से स्मार्ट है जब आवश्यकतानुसार कोई फ़ंक्शन चालू कर सकता है)।

सिंटेक्टिक रूप से मिठाई:

na.zero <- function(x)
{
    "[<-"(x, is.na(x), 0)
}
na.zero(x) + na.zero(y)
# [1] 22 24 26 28 30 32 34 36 38 10

अधिक मोटे तौर पर लागू संस्करण:

na.replace <- function(x, value)
{
    "[<-"(x, is.na(x), value)
}
na.replace(x, 1) * na.replace(x, 1)
# [1]   1   4   9  16  25  36  49  64  81 100

1)% +% एक कस्टम + ऑपरेटर परिभाषित करें:

`%+%` <- function(x, y)  mapply(sum, x, y, MoreArgs = list(na.rm = TRUE))
5 + 2 * (x %+% y - 50) / (x %+% y %+% z %+% a)

दे रही है:

[1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818
[9] 4.739130 3.787879

यहां कुछ सरल उदाहरण दिए गए हैं:

1 %+% 2
## [1] 3

NA %+% 2
## [1] 2

2 %+% NA
## [1] 2

NA %+% NA
## [1] 0

2) na2zero एक और संभावना है एक समारोह को परिभाषित करने के लिए जो इस तरह से NA 0 नक्शे:

na2zero <- function(x) ifelse(is.na(x), 0, x)

X <- na2zero(x)
Y <- na2zero(y)
Z <- na2zero(z)
A <- na2zero(a)

5 + 2 * (X + Y - 50) / (X + Y + Z + A)

दे रही है:

[1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818
[9] 4.739130 3.787879

3) ऊपर संयोजन (2) में विचार के साथ संयोजन (1) के संयोजन में एक भिन्नता है:

X <- x %+% 0
Y <- y %+% 0
Z <- z %+% 0
A <- a %+% 0

5 + 2 * (X + Y - 50) / (X + Y + Z + A)

4) संख्यात्मक वर्ग हम अपने स्वयं के + ऑपरेटर के साथ एक कस्टम क्लास "numeric0" परिभाषित कर सकते हैं:

as.numeric0 <- function(x) structure(x, class = "numeric0")
`+.numeric0` <- `%+%`

X <- as.numeric0(x)
Y <- as.numeric0(y)
Z <- as.numeric0(z)
A <- as.numeric0(a)

5 + 2 * (X + Y - 50) / (X + Y + Z + A)

नोट: उपयोग किए गए इनपुट प्रश्न में होते थे, अर्थात्:

x = 1:10
y = c(21:29,NA)
z = 11:20
a = c(NA,NA,NA,30:36)

rowSums का उपयोग करना:

मेरी टिप्पणी पर विस्तार करने के लिए, आप वैक्टर को जोड़ सकते हैं और फिर परिणामस्वरूप मैट्रिक्स पर अपनी गणना लागू कर सकते हैं। यह आपके लिए आपके प्रश्न के अंत में प्रदान किए गए उदाहरण का हल है;

5 + 2 * (rowSums(cbind(x,y), na.rm = T)-50)/(rowSums(cbind(x,y,z,a), na.rm = T))

#  [1] 3.303030 3.555556 3.769231 4.388889 4.473684 4.550000 4.619048 4.681818 
#  [9] 4.739130 3.787879

नापसंद:

मैंने वैक्टरों में NA की जगह के विचार के साथ समाधान देखा है; मुझे लगता है कि यह भी सहायक होगा:

y[is.na(y)] <- 0 #indexing NA values and replacing with zero