2017-04-24 8 views
5

संक्षेप में: मैं एक सामान्य रास्ता NA से एक निरंतर दूसरे के साथ merge(..., all = TRUE, ...) में लापता मूल्यों को भरने के लिए की तलाश में हूँ।लापता मानों को मर्ज से कैसे भरें (..., all = TRUE, ...) NA के अलावा किसी अन्य मान के साथ?


मान लीजिए कि

z <- merge(x, y, all = TRUE, ...) 

... और मुझे z में सभी लापता मूल्यों (या तो x या y में कुंजियां अनुपलब्ध से उत्पन्न) (गैर NA) से भरा जा करना चाहते हैं कि निरंतर FILL_VALUE


पहले, आसान मामला:

FILL_VALUE <- "-" 

x <- data.frame(K=1001:1005, 
       I=3:7, 
       R=c(0.1, 0.2, 0.3, 0.4, 0.5), 
       B=c(TRUE, FALSE, TRUE, FALSE, TRUE), 
       C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, 0.7+0.8i, 0.9+1.0i)) 

y <- data.frame(K=1001:1003, 
       S1=c("a", "b", "c"), 
       S2=c("d", "e", "f"), 
       stringsAsFactors = FALSE) 

z <- merge(x, y, all = TRUE, by = "K") 

## > z 
##  K I R  B  C S1 S2 
## 1 1001 3 0.1 TRUE 0.1+0.2i a d 
## 2 1002 4 0.2 FALSE 0.3+0.4i b e 
## 3 1003 5 0.3 TRUE 0.5+0.6i c f 
## 4 1004 6 0.4 FALSE 0.7+0.8i <NA> <NA> 
## 5 1005 7 0.5 TRUE 0.9+1.0i <NA> <NA> 

इस मामले में, परिणाम में केवल NA प्रविष्टियों उन merge द्वारा शुरू कर रहे हैं, इसलिए निम्न काम करता है:

z[is.na(z)] <- FILL_VALUE 

## > z 
##  K I R  B  C S1 S2 
## 1 1001 3 0.1 TRUE 0.1+0.2i a d 
## 2 1002 4 0.2 FALSE 0.3+0.4i b e 
## 3 1003 5 0.3 TRUE 0.5+0.6i c f 
## 4 1004 6 0.4 FALSE 0.7+0.8i - - 
## 5 1005 7 0.5 TRUE 0.9+1.0i - - 

अब एक मामला जहां यह समाधान विफल रहता है।

xna <- data.frame(K=1001:1005, 
        I=c(NA, 4:7), 
        R=c(0.1, NA, 0.3, 0.4, 0.5), 
        B=c(TRUE, FALSE, NA, FALSE, TRUE), 
        C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, NA, 0.9+1.0i)) 

yna <- data.frame(K=1001:1003, 
        S1=c(NA, "b", "c"), 
        S2=c("d", NA, "f"), 
        stringsAsFactors = FALSE) 

zna <- merge(xna, yna, all = TRUE, by = "K") 
## > zna 
##  K I R  B  C S1 S2 
## 1 1001 NA 0.1 TRUE 0.1+0.2i <NA> d 
## 2 1002 4 NA FALSE 0.3+0.4i b <NA> 
## 3 1003 5 0.3 NA 0.5+0.6i c f 
## 4 1004 6 0.4 FALSE  NA <NA> <NA> 
## 5 1005 7 0.5 TRUE 0.9+1.0i <NA> <NA> 

zna के लिए वांछित मान वह होता है जिसमें NA मूल्यों कि merge द्वारा शुरू किए गए थे FILL_VALUE द्वारा प्रतिस्थापित कर रहे हैं; IOW:

## > zna 
##  K I R  B  C S1 S2 
## 1 1001 NA 0.1 TRUE 0.1+0.2i <NA> d 
## 2 1002 4 NA FALSE 0.3+0.4i b <NA> 
## 3 1003 5 0.3 NA 0.5+0.6i c f 
## 4 1004 6 0.4 FALSE  NA - - 
## 5 1005 7 0.5 TRUE 0.9+1.0i - - 

इसलिए, यह कर देगा नहीं:

zna[is.na(zna)] <- FILL_VALUE 
## > zna 
##  K I R  B  C S1 S2 
## 1 1001 - 0.1 TRUE 0.1+0.2i - d 
## 2 1002 4 - FALSE 0.3+0.4i b - 
## 3 1003 5 0.3  - 0.5+0.6i c f 
## 4 1004 6 0.4 FALSE  - - - 
## 5 1005 7 0.5 TRUE 0.9+1i - - 

ध्यान दें कि यह काम एक बहुत अधिक से अनुपयुक्त के साथ कुछ मूल्यों को बदलने करता है "-"; यह भी कई स्तंभ के प्रकार परिवर्तन:

## > zna[, "I"] 
## [1] "-" "4" "5" "6" "7" 
## > zna[, "B"] 
## [1] "TRUE" "FALSE" "-"  "FALSE" "TRUE" 
## > zna[, "R"] 
## [1] "0.1" "-" "0.3" "0.4" "0.5" 
## > zna[, "C"] 
## [1] "0.1+0.2i" "0.3+0.4i" "0.5+0.6i" "-"  "0.9+1i" 
+1

शायद आप – akrun

+1

असाइन करने के लिए कॉलम 'एस 1' और 'एस 2' पर 'is.na' के साथ% yna $ k' में 'zna $ k%' के साथ पंक्तियां पा सकते हैं। इस प्रश्न का दूसरा उत्तर ऐसा लगता है यह आपकी समस्या का एक समाधान प्रदान करता है: http://stackoverflow.com/questions/28992362/dplyr-join-define-na-values ​​ – ulfelder

+0

'विलय (x = प्रतिस्थापन (x = xna, list = is.na (xna) के बारे में क्या है), मान = "एक्सएनए"), वाई = प्रतिस्थापित करें (x = yna, list = is.na (yna), मान = "वाईएनए"), = "के", सभी = सही) ' –

उत्तर

1

रूप

> FILL_VALUE <- "-" 
> 
> xna <- data.frame(K=1001:1005, 
+     I=c(NA, 4:7), 
+     R=c(0.1, NA, 0.3, 0.4, 0.5), 
+     B=c(TRUE, FALSE, NA, FALSE, TRUE), 
+     C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, NA, 0.9+1.0i)) 
> 
> yna <- data.frame(K=1001:1003, 
+     S1=c(NA, "b", "c"), 
+     S2=c("d", NA, "f"), 
+     stringsAsFactors = FALSE) 
> 
> 
> # add bools 
> xna$has_xna <- TRUE 
> yna$has_yna <- TRUE 
> 
> # merge 
> zna <- merge(xna, yna, all = TRUE, by = "K") 
> zna 
    K I R  B  C has_xna S1 S2 has_yna 
1 1001 NA 0.1 TRUE 0.1+0.2i TRUE <NA> d TRUE 
2 1002 4 NA FALSE 0.3+0.4i TRUE b <NA> TRUE 
3 1003 5 0.3 NA 0.5+0.6i TRUE c f TRUE 
4 1004 6 0.4 FALSE  NA TRUE <NA> <NA>  NA 
5 1005 7 0.5 TRUE 0.9+1.0i TRUE <NA> <NA>  NA 
> 
> # fill in for NAs due to merge 
> yna_cols <- colnames(zna) %in% colnames(yna) 
> zna[, yna_cols][is.na(zna[, yna_cols]) & is.na(zna$has_yna)] <- FILL_VALUE 
> zna$has_yna <- NULL # remove column 
> 
> # do the same for xna 
> xna_cols <- colnames(zna) %in% colnames(xna) 
> zna[, xna_cols][is.na(zna[, xna_cols]) & is.na(zna$has_xna)] <- FILL_VALUE 
> zna$has_yna <- NULL # remove column 
> 
> # Final results 
> zna 
    K I R  B  C has_xna S1 S2 
1 1001 NA 0.1 TRUE 0.1+0.2i TRUE <NA> d 
2 1002 4 NA FALSE 0.3+0.4i TRUE b <NA> 
3 1003 5 0.3 NA 0.5+0.6i TRUE c f 
4 1004 6 0.4 FALSE  NA TRUE - - 
5 1005 7 0.5 TRUE 0.9+1.0i TRUE - - 

ऊपर इस प्रकार आप कर सकते हैं आसानी से एक सामान्य मर्ज समारोह आवरण को फिर से लिखा जा सकता है। nomatch और on तर्क [.data.table फ़ंक्शन के साथ data.table का उपयोग करने का एक और विकल्प है।

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