2017-09-05 33 views
5

Ví dụ: Tôi đã một df trong đó cột đầu tiên là

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

và sau đó tôi có một df trong đó tôi có trong cột đầu tiên là:

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

dat2[, 2] 
[1] 21000 23400 26800 

Làm thế nào tôi có thể thêm giá trị trong df thứ hai (dat2) vào df đầu tiên (dat)? Trong df đầu tiên có lặp lại và tôi muốn rằng mọi lúc có một "A" nó sẽ thêm giá trị tương ứng (21000) từ df thứ hai trong một cột mới.

Trả lời

5

Tạo dataframe tái sản xuất ...

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) 

Sau đó sử dụng chức năng match.

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

Điều quan trọng là phải chuyển đổi các cột ký tự thành character loại thay vì factor loại hoặc các thành phần sẽ không khớp. Tôi đề cập đến điều này do thuộc tính levels trong dat2 của bạn.

1

Sử dụng chức năng 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

Một lựa chọn thứ ba mà tôi thích là left_join từ dplyr ... Nó có vẻ là nhanh hơn so với merge với khung dữ liệu lớn.

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

Hãy chạy các khung dữ liệu lớn với microbenchmark, chỉ để cho vui!

tạo dataframes lớn

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) 

về nhãn hiệu của bạn, được thiết lập, GO!

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

Nhiều, nhiều giây sau .... left_join là NHIÊU nhanh hơn cho dataframes lớn.

enter image description here

Các vấn đề liên quan