2017-04-04 77 views
2

我有一个数据帧,看起来像我需要通过组基于共同的ID来转以下工作:如何通过组列标题转数据帧中的R

testDF = data.frame(c("Id", "1", "1", "2", "2"), c("Item", 'Milk','Eggs','Bacon', "Bread")) 
testDF 

#>Id        Item 
#>1        Milk 
#>1        Eggs 
#>2        Bacon 
#>2        Bread 

newDT <- dcast(testDF, Id ~ Item, value.var = "Item") 
View(newDT) 

我需要的输出到如下所示(完全不包括标题行和Id列):

Milk, Eggs (Id 1) 
Bacon, Bread (Id 2) 

我收到错误“错误:value.var(项目)在输入未找到”。你能告诉我我做错了什么吗?

谢谢, 马特

+0

对于列表,请使用'split(testDF $ Item,testDF $ Id)'。这是一个非常灵活的对象。对于一个不太灵活的对象作为data.frame可能这个职位:[http://stackoverflow.com/questions/16596515/aggregating-by-unique-identifier-and-concatenating-related-values-into-a-string]( http://stackoverflow.com/questions/16596515/aggregating-by-unique-identifier-and-concatenating-related-values-into-a-string)。 – lmo

+0

您的意思是:testDF = data.frame(Id = c(“1”,“1”,“2”,“2”),Item =('Milk','Eggs','Bacon','Bread' ))? – maller

+0

当我使用代码:result < - aggregate(Item〜Id,data = testDF,paste,collapse =“,”)我收到错误“eval(expr,envir,enclos)中的错误:object'Item'not发现”。有没有理由不承认“项目”? –

回答

1
testDF = data.frame(Id = c("1", "1", "2", "2"), 
       Item = c('Milk','Eggs','Bacon', "Bread")) 
testDF 

z <- aggregate(list(Item = testDF$Item), list(ID = testDF$Id), 
       function(x) paste(x, collapse = ',')) 

z 

    ID  Item 
1 1 Milk,Eggs 
2 2 Bacon,Bread 
+0

这确实会转置数据,但我认为我在原始文章中并不清楚。与前一行具有相同标识的每行应该放在其自己的列中,而不是放在由逗号聚合的同一列中。这是否有意义,你能帮忙吗? –

+0

这个问题就是如果你的ID有不同数量的关联项,“data.frame”的结构就会崩溃,你需要一个“list”对象。在这个特殊的例子中,它只会工作,因为ID有相同数量的关联项目,这里是代码 z < - aggregate(list(Item = testDF $ Item),list(ID = testDF $ Id), 函数(x)unique(x)) –

+0

谢谢。给我以下结果:1,c(3,2)在第1行和第2行,第1行在第2行,各自在不同的列中。 –

0

随着group_bysummarise功能从dplyr您:以上

library("dplyr") 

testDF %>% 
group_by(Id) %>% 
summarise(Items=paste0(Item,collapse=",")) 

testDF 
#Source: local data frame [2 x 2] 
#Groups: Id [2] 
# 
#  Id  Items 
# (fctr)  (chr) 
#1  1 Milk,Eggs 
#2  2 Bacon,Bread 
+0

这里没有'do(data.frame(...))'neeed - 只需使用'summarise' –

+0

谢谢,对于我的'do'锤子,一切看起来都像个钉子:) – OdeToMyFiddle

2

一些很好的答案,但我想这也应该被列为选项:

df %>% 
    group_by(Id) %>% 
    # Create string listing all items in given Id, separated by comma 
    summarise(Items = str_c(Item, collapse = ', ')) 

返回:

# A tibble: 2 × 2 
     Id   Items 
    <fctr>   <chr> 
     1 Milk, Eggs 
     2 Bacon, Bread 
+0

除了你没有任何需要使用非基本的R函数('str_c')之外,这看起来不错。只需使用'Items = toString(Item)' –

+0

T 'stringr'版本'str_c'更快: 'lleters < - rep(letters,times = 1000000); baseFun < - system.time(str_c(lleters)); stringFun < - system.time(toString(lleters)); baseFun; stringFun' – JanLauGe