2012-12-10 20 views
0

假設,有2個data.frames,例如:多個值在一個小區內,使用R

dat1 <- read.table("[path_dat1]", header=TRUE, sep=",") 
    id name age 
    1 Jack 21 
    2 James 40 

dat2 <- read.table("[path_dat2]", header=TRUE, sep=",") 
    id  interests 
    1  football 
    1  basketball 
    1   soccer 
    2 pingpang ball 

如何加入表1和表2成類似下面的一個data.frame?

id name age      interests 
1 1 Jack 21 (football, basketball, soccer) 
2 2 James 40     (pingpang ball) 

如何以最簡單的方式使用plyr加入這些文件?

+1

請包括可以實際加載到R中並進行檢查的簡短示例。 –

+2

@Jack Fu歡迎來到SO。我添加了馬修要求的另一個足球案例,以確保它能處理兩個以上的例子。在將來的帖子中,請提供一些可重現的例子,正如我所做的那樣。這使得提供幫助更容易。這裏有一個鏈接,討論什麼是一個好的可重複的例子是:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

回答

2

我不能告訴你如何在plyr解決這一點,但可以在基地:

dat3 <- aggregate(interests~id, dat2, paste, collapse=",") 
merge(dat1, dat3, "id") 

編輯:如果你真的想在括號您可以使用:

ppaste <- function(x) paste0("(", gsub("^\\s+|\\s+$", "", paste(x, collapse = ",")), ")") 
dat3 <- aggregate(interests~id, dat2, ppaste) 
merge(dat1, dat3, "id") 
+0

你是對的。聚合就足夠了。不需要使用plyr。 –

0

利用泰勒的榜樣:

dat1$interests <- ave(dat1$id, dat1$id, 
     FUN=function(x) paste(dat2[ dat2$id %in% x, "interests"], collapse=",")) 
> dat1 
    id name age      interests 
1 1 Jack 21 football, basketball, soccer 
2 2 James 40     pingpang ball 
+0

謝謝。你的回答也簡潔而鼓舞人心。 –