使用ddply合并R中的重复行

问题描述:

您好我正在尝试使用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

我不会对所有的年龄总结。这是我的代码的问题之一。 –

我没有得到来自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创建一个新的行,发现重复的次数! –

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

您还可以设置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 

您也可以包含分组变量'地址'以获得预期的输出。使用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