R编程语言在一个数据帧内合并对象

R编程语言在一个数据帧内合并对象,r,dataframe,R,Dataframe,我目前有一个包含1000多个对象的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

我目前有一个包含1000多个对象的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,最多可以重复十次左右:

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

使用
dplyr
和base 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
dd%group\u by(name)%%>%mutate(frequency=sum(frequency))
唯一(dd)
来源:本地数据帧[9 x 3]
组:名称
id频率名称
1 146乔治
2240约翰
3托马斯
4 4 122詹姆斯
5 5 32安德鲁
670马丁
7 7 12威廉
8 6扎卡里
955百万

假设
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
>结果[订单(结果$id),]
id名称频率
乔治46
4.2约翰40
7 3托马斯3
3 4詹姆斯122
1 5安德鲁32
5 6马丁70
8 7威廉12
9 8扎卡里6
6955百万美元

也可以使用data.table完成

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

df.dt使用
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

在你的回答中,id从他们身上消失了,但我还有其他我从这里省略的列,我也想保留这些列(每个列对于每次重复出现都是相同的)
id
也被汇总。我认为在Zachary的意图中,它们不应该被汇总。@SabDeM我想你在这里看到了行名。id没有被汇总。这只给出了频率和名称,但删除了所有其他信息,例如id和我没有发布的所有其他字段。如何将
id
作为一个分组嗯:
dt[,(frequency=sum(frequency)),by=(id,name)]
?@Arun,不错我不知道这个语法,请看editlooks!你可以使用
setDT()
将data.frame直接转换为data.table。你可能想看看使用
plyr
的非常干净的解决方案。我喜欢它。