0

我有一个数据框:

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

我通过连接 3 列来创建一个新列:

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 = ";"))

我显然做错了什么。非常感谢你的帮助!

4

1 回答 1

0

我必须说这有点(或完全)疯狂!我逐个尝试了我的代码(底部的那个)并且它起作用了。我将它们合并在一起 - 它起作用了。我不明白为什么我之前遇到错误。这是有效的正确代码(至少现在):

x %>% group_by(concat) %>% summarize(id = paste(id, collapse = ";"), super = unique(super), 
                                     category = unique(category), root = unique(root),
                                     coldefs = paste(coldefs, collapse = ";"))
于 2017-08-09T00:19:02.570 回答