2015-11-07 36 views
1

我设法得到我的原始数据在这种形式(在R),即每个产品组合(3)各自的计数,但你可以看到有重复发生,那里是具有相同产品但这些产品的排序不同的行,我需要一种方法来组合这些行,而不考虑顺序,并添加这些行的总和(num)以获得组合总和。 这只是整个数据集的一部分。帮我找出一个办法来做到这一点。重复行R在不同的序列

   pages    sum(num) 
Badezimmer,Baumarkt,Büromöbel   6 
Badezimmer,Baumarkt,Dekoration  14 
Badezimmer,Baumarkt,Flur    30 
Badezimmer,Baumarkt,Garten   18 
Badezimmer,Baumarkt,Heimtextilien 100 
Badezimmer,Baumarkt,Kinder   28 
Badezimmer,Büromöbel,Baumarkt   16 
Badezimmer,Flur,Baumarkt    40 

回答

3

下面是使用从cSplitlibrary(splitstackshape)一个选项。我们将'data.frame'转换为'data.table',用''选项keep.rownames=TRUE,split'pages'列创建行ID列'rn',并使用cSplit将其转换为'long'格式。按'rn'分组,我们sort'pages'和paste它在一起,我们也得到'sum.num。'的第一个值。然后,我们得到'sum.num。'的sum。按'网页'分组。

library(splitstackshape) 
library(data.table) 
cSplit(setDT(df1, keep.rownames=TRUE), 'pages', ',', 'long')[, 
    list(pages=toString(sort(pages)), sum.num.= sum.num.[1]) ,rn 
    ][,list(Sum=sum(sum.num.)) , .(pages)] 
#         pages Sum 
#1:  Badezimmer, Baumarkt, Büromöbel 22 
#2: Badezimmer, Baumarkt, Dekoration 14 
#3:   Badezimmer, Baumarkt, Flur 70 
#4:  Badezimmer, Baumarkt, Garten 18 
#5: Badezimmer, Baumarkt, Heimtextilien 100 
#6:  Badezimmer, Baumarkt, Kinder 28 

注:从@ RHertel的帖子 'DF1'。

+1

是啊,这有助于,很好的包知道,谢谢 – PSraj

3

这里是一种可能性:

df1$pages <- as.character(df1$pages) # prevent use of factors  
df1$pages <- sapply(sapply(df1$pages,function(x) strsplit(x,",")),function(x) paste(sort(unlist(x)),collapse=',')) #split at commas, order words alphabetically, and restore the description 
df1 <- aggregate(sum.num. ~ ., df1, sum) #sum over identical 'pages' 
#        pages sum.num. 
#1  Badezimmer,Baumarkt,Büromöbel  22 
#2 Badezimmer,Baumarkt,Dekoration  14 
#3   Badezimmer,Baumarkt,Flur  70 
#4  Badezimmer,Baumarkt,Garten  18 
#5 Badezimmer,Baumarkt,Heimtextilien  100 
#6  Badezimmer,Baumarkt,Kinder  28 

数据:

df1 <- structure(list(pages = structure(1:8, 
.Label = c("Badezimmer,Baumarkt,Büromöbel", 
"Badezimmer,Baumarkt,Dekoration", "Badezimmer,Baumarkt,Flur", 
"Badezimmer,Baumarkt,Garten", "Badezimmer,Baumarkt,Heimtextilien", 
"Badezimmer,Baumarkt,Kinder", "Badezimmer,Büromöbel,Baumarkt", 
"Badezimmer,Flur,Baumarkt"), class = "factor"), 
sum.num. = c(6L, 14L, 30L, 18L, 100L, 28L, 16L, 40L)), 
.Names = c("pages", "sum.num."), class = "data.frame", 
row.names = c(NA, -8L)) 
+0

谢谢你,但我恐怕我选择了另一种解决方案,因为我知道了一个不同的包。 – PSraj

+0

不客气 - 并感谢您的反馈。选择你认为最有用的答案是完全没问题的。我也很高兴学习新方法,我认为@akrun的解决方案非常棒。 – RHertel

+0

干得好,这是一项艰巨的任务! 我仍在考虑关于内存“移动”的更高效的解决方案(字符串操作在R中效率并不是很高,特别是如果你在所有行中循环使用[s])。 –