2017-09-05 13 views
5

przykład: I DF, w którym pierwsza kolumna jest

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

a potem jeszcze jeden df, w którym mają w pierwszej kolumnie:

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

dat2[, 2] 
[1] 21000 23400 26800 

Jak można dodać wartości w drugim df (dat2) do pierwszego df (dat)? W pierwszym df są powtórzenia i chcę, aby za każdym razem, gdy pojawiło się "A", doda ono odpowiednią wartość (21000) z drugiego df w nowej kolumnie.

Odpowiedz

5

Generowanie powtarzalne 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) 

Następnie użyj funkcji match.

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

Ważne jest, aby przekształcić swoje kolumn znakowych do character rodzaju zamiast factor typu lub elementów nie pasujących. Wspominam o tym z powodu atrybutu levels w twoim dat2.

1

Użyj funkcji 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

Trzecia opcja, która jest left_join wolę od dplyr ... Wydaje się, że szybciej niż merge z dużych ramek danych.

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

Wyścigi dużych ramek danych z microbenchmark, tylko dla zabawy!

tworzenia dużych 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) 

na miejsca, gotowi, start!

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

Wiele, wiele sekund później .... left_join jest DUŻO szybciej dla dużych dataframes.

enter image description here

Powiązane problemy