如何在数据框中获取一个新列,该数据框中只有元素在R中多次出现在集合中

如何在数据框中获取一个新列,该数据框中只有元素在R中多次出现在集合中,r,dataframe,R,Dataframe,数据: 在数据集中,我有相同大小、相同颜色、相同ItemID的项。每个注册用户都有其唯一的customerID 我想确定当用户订购多个不同尺寸或颜色的相同itemID的产品时=例如customerID=33的用户订购两种不同颜色的相同itemID=2的产品,并在名为like selection orders的新列中标记它例如是或否。它不应向我显示是,当他或她使用其他ID订购物品时。我只想得到一个是,当同一天或过去有一个订单使用相同ID多次订购时-无论其他ID的其他产品如何 我已经试了很多次了,但

数据:

在数据集中,我有相同大小、相同颜色、相同ItemID的项。每个注册用户都有其唯一的customerID

我想确定当用户订购多个不同尺寸或颜色的相同itemID的产品时=例如customerID=33的用户订购两种不同颜色的相同itemID=2的产品,并在名为like selection orders的新列中标记它例如是或否。它不应向我显示是,当他或她使用其他ID订购物品时。我只想得到一个是,当同一天或过去有一个订单使用相同ID多次订购时-无论其他ID的其他产品如何

我已经试了很多次了,但都不管用。有几千个不同的userID和ItemId,所以我不能为每个Id都设置子集。我用复制的函数尝试了它,但没有得到令人满意的解决方案:


问题是,如果同一个人订购了多个对象customerID,然后另一个人订购了一个具有相同Id的项目itemId,那么它会给我一个“是”:在这种情况下,它必须是“否”。在本例中,复制函数将在orderItemID 4处给我一个yes而不是no

我想我现在了解了您想要的输出,请尝试

selection_order = c("yes","no","no","no","no","no","yes","no","no","no")

为了转换回data.frame,请使用DB1如果行表示重复的customerID、itemID元组,则以下代码将向数据帧追加一个新的列selection.order

library(dplyr)
DB1 %>%
  group_by(customerID, itemID) %>%
  mutate(selection_order = n() > 1)

如果您只需要子集,如标题中所述,请执行以下操作:

# First merge together the table to itself
m<- merge(x=DB1,y=DB1,by=c("customerID","itemID"))

# Now find duplicate instances of orderItemID, note this is assumed to be UNIQUE
m$selection.order<-sapply(m$orderItemID.x,function(X) sum(m$orderItemID.x==X)) > 1
m <- m[,c("orderItemID.x","selection.order")]

# Merge the two together
DB1<- merge(DB1, unique(m), by.x="orderItemID",by.y="orderItemID.x",all.x=TRUE,all.y=FALSE)
如果需要该列,则:

DB1[duplicated(DB1[c("itemID", "customerID")]),]

请注意,通过简化上面的最后一行也很容易得到实际计数。

请举一个简单的可重复的例子:-我们并不是那么棒,当您可以提供代码时,我们会浪费时间根据您冗长的描述创建数据集。同时发布您尝试过的内容。没有例子,所以,只需一个指针:ave函数可能有用,也可能是表。检查这些,并使您的问题与预期的输出重复。尽我最大努力将其转换为您可以容忍的形式我希望您能提供您提供的数据框应提供的输出?将不起作用显示也是的,当ID由另一个用户订购时,问题是,如果同一个人订购了多个object customerID,然后另一个人订购了一个ID相同的物品,itemID被Duplicated,那么它会给我一个肯定的回答:这肯定不是唯一的方法我们会理解你真正想要的是提供实际的期望输出,而不是文字,但是,提供的数据的实际数据集与您提供数据集的方式类似,而不是在您不断提供令人困惑的信息时不断发布重复的问题只是希望现在可以理解:是的,就是这样!但是,如果不将数据帧转换为数据表,是否还有另一种可能性?或者如何在以后再次将其转换为数据帧?大卫,你是我今天的英雄:多谢你看我的编辑。我还添加了一些替代解决方案
library(dplyr)
DB1 %>%
  group_by(customerID, itemID) %>%
  mutate(selection_order = n() > 1)
# First merge together the table to itself
m<- merge(x=DB1,y=DB1,by=c("customerID","itemID"))

# Now find duplicate instances of orderItemID, note this is assumed to be UNIQUE
m$selection.order<-sapply(m$orderItemID.x,function(X) sum(m$orderItemID.x==X)) > 1
m <- m[,c("orderItemID.x","selection.order")]

# Merge the two together
DB1<- merge(DB1, unique(m), by.x="orderItemID",by.y="orderItemID.x",all.x=TRUE,all.y=FALSE)
DB1[duplicated(DB1[c("itemID", "customerID")]),]
f <- interaction(DB1$itemID, DB1$customerID)
DB1$multiple <- table(f)[f] > 1L