r语言 - 在其他相同的行中组合单个唯一变量



我正在从 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))是一种指定分组变量应为除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

您的解决方案 A 对我来说看起来不错。我会这样做:-

library(data.table)
setDT(df)
df <- df[, tags := paste0(tag, collapse = ", "), by = project]
df[, tag := NULL]
df <- unique(df)

它会给你你想要的结果 A 方法:

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

我会用 plyr 表示 A)

library(plyr)
df2 <- ddply(df, .(client), function(df){
tags<- paste(df$tag, collapse=",")
df$tag <- tags
df[1,]
})

最新更新