R如何用集合论对列值进行分组

R如何用集合论对列值进行分组,r,dplyr,R,Dplyr,我有这样的数据集: VisitID | Item | 1 | A | 1 | B | 1 | C | 1 | D | 2 | A | 2 | D | 2 | B | 3 | B | 3 | C | 4 | D | 4 | C | VisitID | Item | Classification | 1

我有这样的数据集:

VisitID | Item |
1       | A    |
1       | B    |
1       | C    |
1       | D    |
2       | A    |
2       | D    |
2       | B    |
3       | B    |
3       | C    |
4       | D    |
4       | C    |
VisitID | Item | Classification |
1       | A    | A&B&C          |
1       | B    | A&B&C          |
1       | C    | A&B&C          |
1       | D    | A&B&C          |
2       | A    | A&B            |
2       | D    | A&B            |
2       | B    | A&B            |
3       | B    | B&C            |
3       | C    | B&C            |
4       | D    | C only         |
4       | C    | C only         |
我想根据集合论条件为项目创建一个分类列: VisitID仅包含A、B、C、A&B、A&C、B&C、A&B&C和其他(A、B、C均不存在)

结果应该如下所示:

VisitID | Item |
1       | A    |
1       | B    |
1       | C    |
1       | D    |
2       | A    |
2       | D    |
2       | B    |
3       | B    |
3       | C    |
4       | D    |
4       | C    |
VisitID | Item | Classification |
1       | A    | A&B&C          |
1       | B    | A&B&C          |
1       | C    | A&B&C          |
1       | D    | A&B&C          |
2       | A    | A&B            |
2       | D    | A&B            |
2       | B    | A&B            |
3       | B    | B&C            |
3       | C    | B&C            |
4       | D    | C only         |
4       | C    | C only         |

如何在R中实现这一点,尤其是使用dplyr?

我们可以编写一个自定义函数:

paste_values <- function(x) {
   x1 <- x[x %in% c("A", "B", "C")]
   if (n_distinct(x1) == 1)
   #If want to keep in base R
   #if (length(unique(x1) == 1)
     paste0(unique(x1), " only")
   else
     paste0(unique(x1), collapse = " & ")
}
粘贴值%mutate(项=粘贴值(项))
#VisitID项目
#          
#1 A&B&C
#2.1 A&B&C
#3.1 A&B&C
#4.1 A&B&C
#5.2 A&B酒店
#6.2 A&B酒店
#7.2 A&B酒店
#8.3 B&C酒店
#9.3 B&C酒店
#仅限10.4 C
#仅限11.4 C

我们也可以在base R中使用相同的函数:

df$Item <- with(df, ave(Item, VisitID, FUN = paste_values))

df$Item您可以使用数据的左联接和分组依据、筛选、汇总的数据

library(dplyr)

data %>% left_join(
  group_by(data, VisitID) %>%
  distinct(VisitID, Item) %>%
  filter(Item %in% c("A","B","C")) %>%
  summarise(set=paste0(Item, collapse="&")),
  by="VisitID")

输出:

   VisitID Item   set
1        1    A A&B&C
2        1    B A&B&C
3        1    C A&B&C
4        1    D A&B&C
5        2    A   A&B
6        2    D   A&B
7        2    B   A&B
8        3    B   B&C
9        3    C   B&C
10       4    D     C
11       4    C     C
12       5    D  <NA>
13       5    E  <NA>

所以您只对
项中的A、B和C值感兴趣,而想忽略其余的值?这是正确的。