R编程语言在一个数据帧内合并对象
我目前有一个包含1000多个对象的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
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 Runique
非常简单:
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
的非常干净的解决方案。我喜欢它。