2013-04-05 8 views
6

मेरे पास दो डेटा फ्रेम हैं। एक (df1) में सभी कॉलम और रुचि के पंक्तियां शामिल हैं, लेकिन इसमें अनुपलब्ध अवलोकन शामिल हैं। अन्य (df2) में अनुपलब्ध अवलोकनों के स्थान पर उपयोग किए जाने वाले मान शामिल हैं, और केवल कॉलम और पंक्तियां शामिल हैं जिसके लिए कम से कम एक NAdf1 में मौजूद था। मैं desired.result प्राप्त करने के लिए किसी भी तरह से दो डेटा सेट मर्ज करना चाहता हूं।लापता अवलोकनों को खत्म करने के लिए डेटा फ्रेम मर्ज करें

यह हल करने के लिए एक बहुत ही सरल समस्या की तरह लगता है, लेकिन मैं एक खाली चित्रण कर रहा हूं। मुझे काम करने के लिए merge नहीं मिल सकता है। शायद मैं नेस्टेड for-loops लिख सकता हूं, लेकिन अभी तक ऐसा नहीं किया है। मैंने कुछ समय aggregate भी कोशिश की। मैं इस प्रश्न को पोस्ट करने में थोड़ा डर रहा हूं, मेरा R कार्ड डरने से डर सकता है। क्षमा करें अगर यह एक डुप्लिकेट है। मैंने यहां और Google के साथ काफी तीव्रता से खोज की थी। किसी भी सलाह के लिए धन्यवाद। आधार R में एक समाधान बेहतर है।

df1 = read.table(text = " 
    county year1 year2 year3 
    aa  10 20 30 
    bb  1 NA 3 
    cc  5 10 NA 
    dd 100 NA 200 
", sep = "", header = TRUE) 

df2 = read.table(text = " 
    county year2 year3 
    bb  2 NA 
    cc  NA 15 
    dd 150 NA 
", sep = "", header = TRUE) 

desired.result = read.table(text = " 
    county year1 year2 year3 
    aa  10 20 30 
    bb  1  2 3 
    cc  5 10 15 
    dd 100 150 200 
", sep = "", header = TRUE) 

उत्तर

9

aggregate ऐसा कर सकते हैं:

aggregate(. ~ county, 
      data=merge(df1, df2, all=TRUE), # Merged data, including NAs 
      na.action=na.pass,    # Aggregate rows with missing values... 
      FUN=sum, na.rm=TRUE)   # ...but instruct "sum" to ignore them. 
## county year2 year3 year1 
## 1  aa 20 30 10 
## 2  bb  2  3  1 
## 3  cc 10 15  5 
## 4  dd 150 200 100 
+1

'मज़ा = फ़िल्टर, च = नकारना (is.na)' समारोह के लिए एक और विकल्प (डुप्लिकेट रखेंगे, जो वैसे भी ऐसा नहीं होना चाहिए अगर ओपी विनिर्देश सही हैं) – mnel

+0

ओह हो सकता है, कि ठंडा। बहुत बढ़िया। – Aaron

+0

उत्कृष्ट - बेस आर में वास्तव में साफ-सुथरा और आसानी से व्याख्या करने योग्य कार्यों का एक प्रमुख उदाहरण है जिसे अक्सर अनदेखा किया जाता है। – thelatemail

2

यह करना होगा:

m <- merge(df1, df2, by="county", all=TRUE) 

dotx <- m[,grepl("\\.x",names(m))] 

doty <- m[,grepl("\\.y",names(m))] 

dotx[is.na(dotx)] <- doty[is.na(dotx)] 

names(dotx) <- sapply(strsplit(names(dotx),"\\."), `[`, 1) 

result <- cbind(m[,!grepl("\\.x",names(m)) & !grepl("\\.y",names(m))], dotx) 

जाँच:

> result 
    county year1 year2 year3 
1  aa 10 20 30 
2  bb  1  2  3 
3  cc  5 10 15 
4  dd 100 150 200 
2

एक अन्य विकल्प reshape2 unsing और लंबे समय में काम कर प्रारूप:

library(reshape2) 
## reshape to long format 
df1.m <- melt(df1) 
df2.m <- melt(df2) 
## get common values 
idx <- df1.m$county %in% df2.m$county & 
     df1.m$variable%in% df2.m$variable 
## replace NA values 
df1.m[idx,]$value <- ifelse(is.na(df1.m[idx,]$value), 
          df2.m$value , 
          df1.m[idx,]$value) 
## get the wide format 
dcast(data=df1.m,county~variable) 

    county year1 year2 year3 
1  aa 10 20 30 
2  bb  1  2  3 
3  cc  5 10 15 
4  dd 100 150 200 
+0

आपका उत्तर काफी सामान्य है। उदाहरण के लिए, यह अभी भी काम करता है अगर मैं वर्ष 1 में काउंटी ए के लिए 10 से एनए बदलता हूं और df2 से वर्ष 3 हटा देता हूं। –

+0

@MarkMiller हां क्योंकि यह लंबे प्रारूप से लाभ होता है जो सिर्फ काउंटी (आईडी) के रूप में काउंटी का उपयोग करता है, अन्य कॉलम केवल चर होते हैं। – agstudy

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