r - 将单个唯一变量合并到其他相同的行中

标签 r dplyr tidyr

我正在从 API 中提取数据,该 API 跟踪项目所花费的时间,变量包括时间、客户、项目以及(可能)描述项目的多个标签。然而,当我提取数据时,具有多个标签的条目将被复制到其他相同的行中,每行有一个唯一的标签,如下所示:

 duration client project    tag
       60      A       X  first
       45      B       Y second
       45      B       Y  third
       30      C       Z fourth

如何在组合标签时删除重复的行?我想是这样的:

A)
  duration client project    tags
1       60      A       X   first
2       45      B       Y  second, third
3       30      C       Z  fourth

或者这个:

B)
  duration client project    tag1   tag2
1       60      A       X   first     NA
2       45      B       Y  second  third
3       30      C       Z  fourth     NA

我也希望得到建议,了解哪种建议的安排(A 或 B)最适合能够快速总结项目所花费的时间,例如带有标签“第一”和“第三”(例如 105 分钟) )?

这是示例数据框:

df <- data.frame(
  duration = c(60, 45, 45, 30),
  client = c("A", "B", "B", "C"),
  project = c("X", "Y", "Y", "Z"),
  tag = c("first", "second", "third", "fourth")
  )

我很感激任何建议(我觉得这对于 dplyr/tidyr 来说应该不会太难,但还没有完全能够做到正确)。谢谢!

最佳答案

我们可以使用dplyr作为输出A。group_by_at(vars(-tag))是一种指定分组变量应该是除之外的所有列的方法标记,因为您希望所有其他列在行中完全重复。

library(dplyr)

df2 <- df %>%
  group_by_at(vars(-tag)) %>%
  summarise(tags = toString(tag)) %>%
  ungroup()
df2
# # A tibble: 3 x 4
#   duration client project          tags
#      <dbl> <fctr>  <fctr>         <chr>
# 1       30      C       Z        fourth
# 2       45      B       Y second, third
# 3       60      A       X         first

然后我们可以使用 splitstackshape 作为您的输出 B

library(splitstackshape)
df3 <- df2 %>% cSplit(splitCols = "tags")
df3
#    duration client project tags_1 tags_2
# 1:       30      C       Z fourth     NA
# 2:       45      B       Y second  third
# 3:       60      A       X  first     NA

关于r - 将单个唯一变量合并到其他相同的行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47820969/

相关文章:

r - 通过分离列来融合数据

r - R dplyr中行之间的时间差,不同单位

r - ggarrange 绘制列表中的所有图

r - 列表中的 bind_rows 即使 class() 不同

r - 使用 dplyr 从 SQL 语句创建表

r - 如何通过R中的多列计算逻辑值?

r - 使用separate() 分割日期

r - 用 R 删除反向重复项

r - 使用 rgeos 库合并国家多边形

r - 使用嵌套标题的汇总表