मेरे पास नीचे 2 डेटाफ्रेम हैं:

Names<-c("Max","Helen","Bob","Eva")
Id<-c(1,2,3,4)
LISTN<-data.frame(Names,Id)

Name1<-c("Max","Bob")
Name2<-c("Helen","Eva")
PAIRS<-data.frame(Name1,Name2)

मैं PAIRS के कॉलम Name1 और Name2 के मानों को LISTN में पाए गए संबंधित Id से बदलना चाहता हूं। परिणाम इसकी तरह दिखना चाहिए:

Name1 Name2
1     1     2
2     3     4
r
1
firmo23 16 जिंदा 2019, 00:25

2 जवाब

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

मैं match का उपयोग करके दो तरीकों के बारे में सोच सकता हूं, एक फ़ंक्शन जिसे ऑर्डर किए गए मानों को अनुक्रमण स्थितियों में परिवर्तित करने के लिए डिज़ाइन किया गया है:

> sapply(PAIRS, match, LISTN$Names)  # returns matrix
     Name1 Name2
[1,]     1     2
[2,]     3     4

> as.data.frame(lapply(PAIRS, match, LISTN$Names)) # returns dataframe
  Name1 Name2
1     1     2
2     3     4

यदि नाम पहले से क्रमिक रूप से आदेशित नहीं किए गए थे, तो आपको पहले उस पर ध्यान देना होगा।

3
IRTFM 16 जिंदा 2019, 00:32

tidyverse के साथ आप यह कर सकते हैं:

PAIRS %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 left_join(LISTN, by = c("val" = "Names")) %>%
 select(-val) %>%
 spread(var, Id) %>%
 select(-rowid)

  Name1 Name2
1     1     2
2     3     4

यह PAIRS df को वाइड से लॉन्ग फॉर्मेट में बदल रहा है, इसे नामों पर LISTN df के साथ मर्ज कर रहा है और फिर इसे "Id" के मानों के साथ वाइड फॉर्मेट में बदल रहा है।

1
tmfmnk 16 जिंदा 2019, 00:37