2015-10-20 131 views
0

您好我正在嘗試使用ddply在R中合併重複的數據行。 這裏是我處理的數據的一個例子:使用ddply合併R中的重複行

name <- c("Bob", "Mary", "Bob", "Dillan", "Bob", "Mary") 
age <- c(30, 20, 30, 25, 29, 20) 
address <- c("123 Fake Street", "321 Park Ave", "123 Fake Street", "49 Rodeo Drive", "10 Broadway", "321 Park Ave") 
election.count <- c("1", "1", "1", "1", "1", "1") 
df <- data.frame(name, age, address, election.count) 

    name age    address election.count 
1 Bob 30  123 Fake Street    1 
2 Mary 20  321 Park Ave    1 
3 Bob 30  123 Fake Street    1 
4 Dillan 25  49 Rodeo Drive    1 
5 Bob 29   10 Broadway    1 
6 Mary 20  321 Park Ave    1 

我期待與行相同的名字和年齡相結合。使用ddply我得到

ddply(df, "name", numcolwise(sum)) 

    name age election.count 
1 Bob 89    3 
2 Dillan 25    1 
3 Mary 20    2 

是否有修改ddply所以我能得到

name age    address election.count 
1 Bob 30  123 Fake Street    1 
2 Bob 29   10 Broadway    2 
2 Dillan 25  49 Rodeo Drive    1 
3 Mary 20   321 Park Ave    2 
+1

瑪麗40是一個錯字嗎?你總結年齡? –

+0

是的,這是一個錯字,我會糾正這個錯誤 –

+0

我不會對所有的年齡總結。這是我的代碼的問題之一。 –

回答

0

我沒有得到來自ddply(df, "name", numcolwise(sum))呼叫election.count輸出的,只有nameage(作爲和)。

也就是說,您可以使用.(col1, col2)語法在plyr函數中按多列進行分組。舉例來說,我認爲這可以讓你想要的東西:

ddply(df, .(name, age), nrow) 
#  name age V1 
# 1 Bob 29 1 
# 2 Bob 30 2 
# 3 Dillan 25 1 
# 4 Mary 20 2 
+0

謝謝最大這實際上完美的作品。我甚至沒有想過讓R創建一個新的行,發現重複的次數! –

1
library(dplyr) 

df %>% 
    group_by(name, age) %>% 
    tally() 

,你會得到

Source: local data frame [4 x 3] 
Groups: name [?] 

    name age  n 
    (fctr) (dbl) (int) 
1 Bob 29  1 
2 Bob 30  2 
3 Dillan 25  1 
4 Mary 20  2 

更新: @大衛是正確的。 count是一個更簡單的選擇。 :)

+3

也可以'df%>%count(姓名,年齡)' –

+0

@DavidRobinson Ahha,我差點忘了'count'。這裏好多了。 – Hao

0

您還可以設置rownames。

ddply(df, .(name, age), summarize, election.count=nrow(piece)) 
# name age election.count 
# 1 Bob 29    1 
# 2 Bob 30    2 
# 3 Dillan 25    1 
# 4 Mary 20    2 
1

您也可以包含分組變量'地址'以獲得預期的輸出。使用data.table,我們將'data.frame'轉換爲'data.table'(setDT(df)),按'name','age','address'分組,我們得到了nrow(.N)。

library(data.table) 
setDT(df)[, list(election.count=.N), .(name, age, address)] 
#  name age   address election.count 
#1: Bob 30 123 Fake Street    2 
#2: Mary 20 321 Park Ave    2 
#3: Dillan 25 49 Rodeo Drive    1 
#4: Bob 29  10 Broadway    1