मेरे पास दो डेटा हैं। फ्रेम हजारों पंक्तियों और दर्जनों स्तंभों के साथ, दोनों कई सीएसवी फाइलों को मर्ज करके बनाए गए हैं। data.frames वही हैं जो मैं चाहता था। मैं यह भी जोड़ूंगा कि df1 और df2 में कई कॉलम समान हैं। केवल समस्या यह है कि उनमें से एक में, df1 कहें, कुछ स्तंभों के लिए, कुछ NA (यह अपेक्षित/सामान्य है)। अच्छी बात यह है कि वही कॉलम जिनमें मेरे पास एनए हैं, दूसरे डेटा फ्रेम में भी होते हैं, डीएफ 2 कहें, लेकिन एनए के साथ नहीं। मैं क्या करना चाहता हूं कि डीएफ 2 के दिए गए कॉलम में एनएएस को डीएफ 1 के उसी कॉलम से मानों से भरना है जहां डीएफ 1 और डीएफ 2 के बीच अन्य कॉलम वैल्यू के मिलान के आधार पर प्रत्येक मान का चयन किया जाता है।

कुछ यादृच्छिक डेटा का उपयोग करना:

A<- format(seq(as.Date("2021/09/01"), by = "day", length.out = 26), format="%Y%m%d")
B<- format(seq(as.POSIXct("2021-1-1 15:00"), as.POSIXct("2021-1-02 16:00"), by = "hour"), format = "%H:%M")
C<- sample(1:100, 26, replace=FALSE)
D<- LETTERS
E<- paste(D, C)

df1<- cbind(A, B, C, D)
df2<- cbind(A, B, C, E)
df2[c(7:10, 13, 18:21), 3] <- NA #replace some of the values with NAs
df2<- df2[-c(2,5,11,17,23,26),] #delete some columns so df1 and df2 are of different size

मैं चाहता हूं कि df2$C के लिए, जब एक NA मान मिलता है, तो संबंधित df2$A और df2$B दोनों मानों का मिलान सभी df1$A और df2$B से किया जाता है। जब, और केवल अगर, df1$A और df1$B से मेल खाने वाली df1 में एक पंक्ति पाई जाती है, तो df1$C के संगत मान को df2$C NA मान में कॉपी किया जाता है। दूसरे शब्दों में, उपरोक्त उदाहरण डेटा के लिए, यदि df2$C में कोई NA मान है, तो उस विशिष्ट पंक्ति के लिए दिनांक और समय के संगत संयोजन को df1 से दिनांक और समय के सभी परिणामी संयोजन के साथ मिलान किया जाना चाहिए और जब एक मैच पाया जाता है, df2$C में NA को बदलने के लिए df1$C के संगत मान का उपयोग किया जाता है।

# as an instance, a case of my df2 where a NA occurs is
df2[17,3] 

#This should be replaced with the value from
df1[21,3] 

# because the time and date of 
df2[17,] 

A          B          C          E 
"20210921"    "11:00"         NA     "U 46" 

#is the same than 
df1[21,] 

A          B          C          D 
"20210921"    "11:00"       "46"        "U" 

मुझे 100% यकीन है कि प्रत्येक डेटा फ्रेम में कॉलम ए और बी का संयोजन प्रत्येक डेटा फ्रेम में अद्वितीय परिणाम देता है ताकि डीएफ 1 $ ए और डीएफ 1 $ बी का संयोजन अद्वितीय होगा और यह डीएफ 2 पर भी लागू होता है। साथ ही, निश्चित रूप से, df2$A और df2$B के संयोजन से df1 में कॉलम A और B के संयोजन से मेल खाने वाला एक और एकमात्र मान होगा। इस कारण से मैंने प्रत्येक डेटा के लिए संयोजन करने का प्रयास किया है। बेस आर में एक और लूप के भीतर मिलान (पेस्ट (..., ...)) का उपयोग करके मिलान मूल्यों को खोजने के लिए कॉलम ए और बी को एक नए कॉलम में फ्रेम करता है और वैकल्पिक रूप से अन्य मंचों में प्रस्तावित dplyr पुस्तकालय का उपयोग करके अन्य समाधान, लेकिन मुझे ऐसा समाधान नहीं मिल रहा है जो मेरे लिए कारगर हो। मुझे लगता है कि यह कई मानदंडों के साथ एक्सेल लुकअप/वीलुकअप फ़ंक्शन के समान है लेकिन मैं इसे आर में नहीं समझ सकता।

कैसे आगे बढ़ना है पर कोई सुझाव? धन्यवाद।

0
Nino Pierantonio 3 सितंबर 2021, 16:38

2 जवाब

सबसे बढ़िया उत्तर

आप df2 को अपडेट करने के लिए एक अद्वितीय कुंजी बना सकते हैं।

unique_key1 <- paste(df1$A, df1$B)
unique_key2 <- paste(df2$A, df2$B)
inds <- is.na(df2$C)
df2$C[inds] <- df1$C[match(unique_key2[inds], unique_key1)]
df2

#         A     B  C    E
#1  20210901 15:00 74 A 74
#2  20210903 17:00 27 C 27
#3  20210904 18:00 60 D 60
#4  20210906 20:00  7  F 7
#5  20210907 21:00 96 G 96
#6  20210908 22:00 98 H 98
#7  20210909 23:00 38 I 38
#8  20210910 00:00 89 J 89
#9  20210912 02:00 69 L 69
#10 20210913 03:00 72 M 72
#11 20210914 04:00 76 N 76
#12 20210915 05:00 63 O 63
#13 20210916 06:00 13 P 13
#14 20210918 08:00 25 R 25
#15 20210919 09:00 92 S 92
#16 20210920 10:00 21 T 21
#17 20210921 11:00 79 U 79
#18 20210922 12:00 41 V 41
#19 20210924 14:00 97 X 97
#20 20210925 15:00 16 Y 16

डेटा

cbind एक मैट्रिक्स बनाता है, डेटाफ़्रेम बनाने के लिए data.frame का उपयोग करें।

df1 <- data.frame(A, B, C, D)
df2 <- data.frame(A, B, C, E)
0
Ronak Shah 4 सितंबर 2021, 01:00

चूंकि आप पहले ही dplyr का उल्लेख कर चुके हैं; यह नौकरी के लिए उपकरण प्रदान करता है। आप जिस कॉलम का मिलान करना चाहते हैं, उस पर बस left_join, फिर coalesce परिणाम दूसरी तालिका से मेल खाने वाले मानों के साथ 'सी' के लापता मानों को बदलने के लिए।

library(dplyr)
df1 <- as.data.frame(df1)
df2 <- as.data.frame(df2)

concatenate <- df2 %>%
    left_join(df1, by = c('A', 'B'), suffix = c('', '.y')) %>%
    mutate(C = coalesce(C, C.y)) %>%
    select(-c(C.y))
0
Colin H 3 सितंबर 2021, 18:36