2017-09-05 6 views
5

उदाहरण: मैं एक df, जिसमें प्रथम स्तंभ

dat <- c("A","B","C","A") 

है और फिर मैं एक और df जिसमें मैं पहले कॉलम में है है:

dat2[, 1] 
[1] A B C 
Levels: A B C 

dat2[, 2] 
[1] 21000 23400 26800 

मैं कैसे जोड़ सकते हैं दूसरे डीएफ (dat2) में पहले डीएफ (dat) में मान? पहले डीएफ में पुनरावृत्तियां होती हैं और मैं चाहता हूं कि हर बार एक "ए" होता है, यह एक नए कॉलम में दूसरे डीएफ से संबंधित मान (21000) जोड़ देगा।

उत्तर

5

जनरेट कर रहा है प्रतिलिपि प्रस्तुत करने योग्य dataframe ...

dat1 <- data.frame(x1 = c("A","B","C","A"), stringsAsFactors = FALSE) 
dat2 <- data.frame(x1 = c("A","B","C"), 
        x2 = c(21000, 23400, 26800), stringsAsFactors = FALSE) 

फिर match समारोह का उपयोग करें।

dat1$dat2_vals <- dat2$x2[match(dat1$x1, dat2$x1)] 

यह बजाय character प्रकार factor प्रकार या तत्वों से मेल नहीं खाएगी करने के लिए अपने चरित्र स्तंभों को बदलने के लिए महत्वपूर्ण है। मैं आपके डेटा 2 में levels विशेषता के कारण इसका उल्लेख करता हूं।

1

merge फ़ंक्शन का उपयोग करें।

# Input data 
dat <- data.frame(ID = c("A", "B", "C", "A")) 
dat2 <- data.frame(ID = c("A", "B", "C"), 
        value = c(1, 2, 3)) 
# Merge two data.frames by specified column 
merge(dat, dat2, by = "ID") 
    ID value 
1 A  1 
2 A  1 
3 B  2 
4 C  3 
2

एक तीसरा विकल्प है जो मुझे पसंद करते हैं dplyr से left_join है ... यह तेजी से merge से बड़े डेटा फ्रेम के साथ हो रहा है।

require(dplyr) 

dat1 <- data.frame(x1 = c("A","B","C","A"), stringsAsFactors = FALSE) 
dat2 <- data.frame(x1 = c("A","B","C"), 
        x2 = c(21000, 23400, 26800), stringsAsFactors = FALSE) 

dat1 <- left_join(dat1, dat2, by="x1") 
2

आइए दौड़ microbenchmark के साथ बड़े dataframes, सिर्फ मनोरंजन के लिए! , GO

बड़े dataframes

dat1 <- data.frame(x1 = rep(c("A","B","C","A"), 1000), stringsAsFactors = FALSE) 
dat2 <- data.frame(x1 = rep(c("A","B","C", "D"), 1000), 
        x2 = runif(1,0), stringsAsFactors = FALSE) 

अपने निशान पर बनाने के लिए, तैयार हो जाओ!

library(microbenchmark) 
mbm <- microbenchmark(
    left_join = left_join(dat1, dat2, by="x1"), 
    merge = merge(dat1, dat2, by = "x1"), 
    times = 20 
) 

कई, कई सेकंड बाद .... left_join ज्यादा बड़े dataframes के लिए तेजी से होता है।

enter image description here

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