使用ddply合并R中的重复行

时间:2015-10-20 03:05:29

标签: r plyr

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

4 个答案:

答案 0 :(得分: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

更新: @David是对的。 count是一个更简单的选择。 :)

答案 1 :(得分:1)

您也可以包含分组变量'address'以获得预期的输出。使用data.table,我们将'data.frame'转换为'data.table'(setDT(df)),按'name','age','address'分组,我们得到nrow({{ 1}})。

.N

答案 2 :(得分: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

答案 3 :(得分:-1)

我没有收到election.count来电的ddply(df, "name", numcolwise(sum))输出,只有nameage(作为总和)。

也就是说,您可以使用plyr语法在.(col1, col2)个函数中按多列进行分组。例如,我认为这可以得到你想要的东西:

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