2015-06-23 62 views
2

我目前有一个R数据框,超过1,000个对象,每个对象都应该有唯一的第一个元素,但某些元素会多次出现,我想合并这些对象在一起,因此,例如,如果我有:R编程语言合并一个数据框中的对象

id frequency name 
1 43  George 
2 23  John 
3 3   Thomas 
2 17  John 
4 122  James 
5 32  Andrew 
6 67  Martin 
7 12  William 
1 3   George 
8 6   Zachary 
6 3   Martin 
9 55  Millard 

我希望把它做成这样的事情(如果你发现每个人都用相同的ID具有所有的相同的信息,除了频率),这里的一切保持除了我将所有频率添加到其他所有其他频率之外(对于某些ID,可以有多达10个左右的重复频率):

id frequency name 
1 46  George 
2 40  John 
3 3   Thomas 
4 122  James 
5 32  Andrew 
6 70  Martin 
7 12  William 
8 6   Zachary 
9 55  Millard 

回答

1

也可以用数据来完成。表。

library(data.table) 
df.dt <- data.table(df) 
df.dt[, .(freq=sum(freq)), by=.(id, name)] 

编辑

与阿伦

+0

这只给出了频率和名称,但删除了所有其他信息,例如我没有发布的ID和所有其他字段 –

+0

如何在分组中包含ID也如此: dt [,。(frequency = sum(frequency)),by =。(id,name)]'? – Arun

+0

@阿伦,很好我不知道这个语法,请看编辑 – JHowIX

1

很不容易的事与dplyr结合基础R unique

dd <- dat %>% group_by(name) %>% mutate(frequency = sum(frequency)) 
unique(dd) 
Source: local data frame [9 x 3] 
Groups: name 

    id frequency name 
1 1  46 George 
2 2  40 John 
3 3   3 Thomas 
4 4  122 James 
5 5  32 Andrew 
6 6  70 Martin 
7 7  12 William 
8 8   6 Zachary 
9 9  55 Millard 
+0

的ID从他们消失在你的答案,但我也有,我从这里省略了其他列我希望保持一致(每个重复出现的每一列都是相同的) –

1

假设DF是你data.frame,那么你可以使用aggregate

> result <- aggregate(frequency~id+name, sum, data=DF) 
> result[order(result$id), ] 
    id name frequency 
2 1 George  46 
4 2 John  40 
7 3 Thomas   3 
3 4 James  122 
1 5 Andrew  32 
5 6 Martin  70 
8 7 William  12 
9 8 Zachary   6 
6 9 Millard  55 
+1

'id's也总结了一下。我认为Zachary的意图不应该归结。 – SabDeM

+0

@SabDeM我想在这里你看到了行名。 ID不总结 –

1

评论使用ddply

library('plyr') 
ddply(dat, .(id,name), summarize, frequency = sum(frequency)) 

# id name frequency 
#1 1 George  46 
#2 2 John  40 
#3 3 Thomas   3 
#4 4 James  122 
#5 5 Andrew  32 
#6 6 Martin  70 
#7 7 William  12 
#8 8 Zachary   6 
#9 9 Millard  55 
+1

非常干净的解决方案与'plyr'我喜欢它。 – SabDeM