2017-08-08 45 views
0

我有一个数据帧:通过连接3列[R骨料和折叠多个单元格成一个

x <- data.frame(id = 1:18, 
       super = c(rep("A", 12), rep("B", 6)), 
       category = c(rep("one", 6), rep("two", 6), rep("three", 6)), 
       root = sort(rep(letters[1:6], 3)), 
       coldefs = letters[1:18], stringsAsFactors = F) 
x 

我创建一个新的列:

myvars <- c("super", "category", "root") 
library(tidyverse) 
x <- x %>% unite(col = concat, myvars, sep = "_", remove = F) 
x 

现在,对于列的每个唯一值'concat'列'super'的值是相同的,'category'列的值是相同的,并且列“root”的值是相同的。但是,对于'concat'列的每个唯一值,列'id'的值是不同的。列'coldefs'也是如此。

我想崩溃(聚合)x,以便它只有行'concat'(即6行)中有唯一值的行数。在每一行中,我希望列'super'中有一个值,'category'列中有一个值,'root'列中有一个值。然后列'id'的3个值(连接像这样:1; 2; 3)和列'coldefs'的3个值(连接像这样:a; b; c)。

这样做的最好方法是什么? 我尝试以下,但它不工作:

x %>% group_by(concat) %>% summarize(id = paste(id, collapse = ";"), 
            super = unique(super), category = unique(category), root = unique(root), 
            coldefs = paste(coldefs, collapse = ";")) 

我清楚地做错了什么。 非常感谢您的帮助!

+0

那是'unite'正确的示例代码?我运行时出现以下错误:'错误:所有select()输入都必须解析为整数列位置。 以下不是: * myvars' – lebelinoz

+0

我关闭了我的R,打开了一个干净的新R会话,并在上面运行了我的代码(灰色的前2个部分 - 包括unite)。一切都运行没有错误。我在Windows PC上使用R版本3.4.1。团结只是连接 – user3245256

+0

“关闭并再次打开它”:许多IT问题的解决方案:P – lebelinoz

回答

0

我必须说这是有点(或完全)疯狂!我一段一段地尝试我的代码(底部的代码),它的工作。我将它们合并在一起 - 并且工作。我不明白为什么我以前得到错误。这里是正确的代码(至少现在):

x %>% group_by(concat) %>% summarize(id = paste(id, collapse = ";"), super = unique(super), 
            category = unique(category), root = unique(root), 
            coldefs = paste(coldefs, collapse = ";")) 
+0

如果首先没有任何问题,您可以删除您的问题:)。你可能在'tidyverse'之后加载了另一个包,并且一个函数给出的输出不足 –

+0

我无法弄清楚如何删除这个问题 – user3245256

+0

正好在问题标签下面,编辑等 –