2016-08-25 13 views
6

Tôi đang cố hợp nhất hai tập dữ liệu. Trong quá khứ tôi đã sử dụng merge() với by bằng với biến tôi muốn hợp nhất. Tuy nhiên, bây giờ tôi muốn làm như vậy với hai biến. Tập dữ liệu đầu tiên của tôi trông giống như sau:Hợp nhất dữ liệu theo 2 biến trong R

Year Winning_Tm Losing_Tm 
2011 Texas   Washington 
2012 Alabama  South Carolina 
2013 Tennessee  Texas 

Sau đó, tôi có một bộ dữ liệu khác với thứ hạng của mỗi nhóm (điều này rất đơn giản) cho mỗi năm. Như thế này:

Year Team    Rank 
2011 Texas   32 
2011 Washington  34 
2012 South Carolina 45 
2012 Alabama   12 
2013 Texas   6 
2013 Tennessee  51 

Tôi muốn kết hợp chúng vì vậy tôi có một tập hợp dữ liệu mà trông như thế này:

Year Winning_Tm Winning_TM_rank Losing_Tm  Losing_Tm_rank 
2011 Texas   32     Washington  34 
2012 Alabama  12     South Carolina 45 
2013 Tennessee  51     Texas   6 

Hy vọng của tôi là có một cách đơn giản để làm điều này nhưng nó có thể là phức tạp hơn. Cảm ơn!

Trả lời

2

Hai hòa trộn riêng biệt. Bạn cần phải bọc danh sách các biến số by trong c() và vì các biến có tên khác nhau, bạn cần by.xby.y. Sau đó bạn có thể đổi tên các biến thứ hạng.

Tôi sẽ gọi dữ liệu của bạn winloseteamrank tương ứng.Sau đó, bạn sẽ cần:

first_merge <- merge(winlose, teamrank, by.x = c('Year', 'Winning_Tm'), by.y = c('Year', 'Team')) 
second_merge <- merge(first_merge, teamrank, by.x = c('Year', 'Losing_Tm'), by.y = c('Year', 'Team')) 

Đổi tên các biến:

names(second_merge)[names(second_merge) == 'Rank.x'] <- 'Winning_Tm_rank' 
names(second_merge)[names(second_merge) == 'Rank.y'] <- 'Losing_Tm_rank' 
+1

Hãy nhớ rằng 'rank' là một hàm dựng sẵn, có thể dẫn đến xung đột tên không mong muốn. –

+2

Ah, catch tốt, tôi chưa bao giờ sử dụng chức năng đó. Đã chỉnh sửa câu trả lời của tôi để thay đổi 'xếp hạng' thành' teamrank'. –

4

tôi sao chép dữ liệu của bạn (cố gắng bao gồm một dput của nó lần sau):

A <- data.frame(
    Year = c(2011, 2012, 2013), 
    Winning_Tm = c("Texas","Alabama","Tennessee"), 
    Losing_Tm = c("Washington","South Carolina", "Texas"), 
    stringsAsFactors = FALSE 
) 

B <- data.frame(
    Year = c("2011","2011","2012","2012","2013","2013"), 
    Team = c("Texas","Washington","South Carolina","Alabama","Texas","Tennessee"), 
    Rank = c(32,34,45,12,6,51), 
    stringsAsFactors = FALSE 
) 

Bạn có thể melt các dataframe đầu tiên sử dụng reshape2 gói:

library(reshape2) 

A <- melt(A, id.vars = "Year") 
names(A)[3] <- "Team" 

Bây giờ nó trông như thế này :

> A 
    Year variable   Team 
1 2011 Winning_Tm   Texas 
2 2012 Winning_Tm  Alabama 
3 2013 Winning_Tm  Tennessee 
4 2011 Losing_Tm  Washington 
5 2012 Losing_Tm South Carolina 
6 2013 Losing_Tm   Texas 

Sau đó, bạn có thể hợp nhất các bộ dữ liệu với nhau bằng hai cột quan tâm:

AB <- merge(A, B, by=c("Year","Team")) 

nào trông như thế này:

> AB 
    Year   Team variable Rank 
1 2011   Texas Winning_Tm 32 
2 2011  Washington Losing_Tm 34 
3 2012  Alabama Winning_Tm 12 
4 2012 South Carolina Losing_Tm 45 
5 2013  Tennessee Winning_Tm 51 
6 2013   Texas Losing_Tm 6 

Sau đó sử dụng lệnh reshape từ cơ sở R bạn có thể thay đổi AB sang một định dạng rộng:

reshape(AB, idvar = "Year", timevar = "variable", direction = "wide") 

Kết quả:

Year Team.Winning_Tm Rank.Winning_Tm Team.Losing_Tm Rank.Losing_Tm 
1 2011   Texas    32  Washington    34 
3 2012   Alabama    12 South Carolina    45 
5 2013  Tennessee    51   Texas    6 
+1

Tôi đã sử dụng phương pháp của bạn và phương pháp hoạt động tốt, ngoại trừ việc có vẻ như các nhóm khó hiểu lặp lại (tôi nghĩ). đây là thông điệp cảnh báo: Cảnh báo tin nhắn: 1: Trong định dạng lại (dữ liệu, idvar = idvar, timevar = timevar, thay đổi = khác nhau,: nhiều hàng khớp với biến = L_Tm: lần đầu tiên được chụp 2: Trong định dạng lại (dữ liệu, idvar = idvar, timevar = timevar, thay đổi = khác nhau,: nhiều hàng khớp với biến = W_Tm: đầu tiên được chụp –

+0

Điểm tốt @ a.powell. Liệu khung dữ liệu kết quả sau khi 'định lại hình ảnh 'chỉ hiển thị các nhóm lặp lại một lần không? – Warner

+0

Nó chỉ hiển thị Trò chơi từ "Không quân" là nhóm chữ cái đầu tiên trong danh sách và định hình lại chúng đang chơi. –

2

Nếu bạn đã quen thuộc với SQL một cách khá phức tạp, nhưng nhanh chóng để làm điều này tất cả trong một bước sẽ là:

res <- sqldf("SELECT l.*, 
        max(case when l.Winning_Tm = r.Team then r.Rank else 0 end) as Winning_Tm_rank, 
        max(case when l.Losing_Tm = r.Team then r.Rank else 0 end) as Losing_Tm_rank 
      FROM  df1 as l 
      inner join df2 as r 
      on  (l.Winning_Tm = r.Team 
      OR  l.Losing_Tm = r.Team) 
      AND  l.Year = r.Year 
      group by l.Year, l.Winning_Tm, l.Losing_Tm") 

res 
    Year Winning_Tm  Losing_Tm Winning_Tm_rank Losing_Tm_rank 
1 2011  Texas  Washington    32    34 
2 2012 Alabama South_Carolina    12    45 
3 2013 Tennessee   Texas    51    6 

dữ liệu:

df1 <- read.table(header=T,text="Year Winning_Tm Losing_Tm 
2011 Texas   Washington 
2012 Alabama  South_Carolina 
2013 Tennessee  Texas") 

df2<- read.table(header=T,text="Year Team Rank 
2011 Texas   32 
2011 Washington  34 
2012 South_Carolina 45 
2012 Alabama   12 
2013 Texas   6 
2013 Tennessee  51") 
0

Hãy X1 chứa bảng đầu tiên của bạn và X2 chứa bảng thứ hai của bạn.

library(dplyr) 
library(plyr) 

## Create a joint table to work with 
XX <- inner_join(X1, X2, by="Year") 

## Compute the ranks 
f <- function(x, y, r) { r[ as.character(x) == as.character(y) ] } 
rr <- ddply(XX, "Year", summarise, 
    Winning_TM_Rank = f(Team, Winning_Tm, Rank), 
    Losing_TM_Rank = f(Team, Losing_Tm, Rank)) 

## Combine the results and reorder the columns 
inner_join(X1, rr)[,c(1,2,4,3,5)] 
Các vấn đề liên quan