2014-10-28 5 views
0

데이터 표시 요소 만이 데이터 프레임에 새로운 열을 얻는 방법 : 데이터 세트에서R에 두 번 이상 세트에

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

:

DB1 <- data.frame(orderItemID = c(1,2,3,4,5,6,7,8,9,10), 
orderDate = c("1.1.12","1.1.12","1.1.12","1.1.12","1.1.12", "1.1.12","1.1.12","1.1.12","2.1.12","2.1.12"), 
itemID = c(2,3,2,5,12,4,2,3,1,5), 
size = factor(c("l", "s", "xl", "xs","m", "s", "l", "m", "xxs", "xxl")), 
color = factor(c("blue", "black", "blue", "orange", "red", "navy", "red", "purple", "white", "black")), 
customerID = c(33, 15, 1, 33, 14, 55, 33, 78, 94, 23)) 

예상 출력을 동일한 크기 또는 동일한 색상, 동일한 ItemID를 가진 항목이 있습니다. 등록 된 모든 사용자는 고유 한 고객 ID를가집니다.

사용자가 동일한 itemID (여러 크기 또는 색상 = 예 : customerID = 33의 사용자가 동일한 항목 (ItemID = 2) 두 가지 색상으로 주문한 사용자)를 주문한 경우 식별하고 싶습니다. 예를 들어 "선택 순서"(예 : "Yes"또는 "No")와 같은 새 열에 표시됩니다. 다른 ID로 항목을 주문할 때 "예"라고 표시해서는 안됩니다. 나는 다른 ID (다른 제품)와 관계없이 같은 ID로 한 번 이상 (한 번에 또는 과거에) 주문이있을 때 "예"를 원합니다.

나는 이미 많은 노력을했지만 아무런 효과가 없습니다. 몇 천 개의 서로 다른 사용자 ID와 항목 ID가 있으므로 모든 ID에 대해 하위 집합을 지정할 수 없습니다. 나는 중복 된 기능으로 시도했다. 그러나 만족스러운 해결책으로 시도하지는 않았다 :

동일한 사람이 하나 이상의 객체 (고객 ID가 복제 됨)를 주문하고 다른 사람 (customerId)이 항목을 주문하면 같은 ID로 (itemId가 복제되면) "yes"를 표시합니다.이 경우 "아니오"여야합니다. 내가 원하는 출력이 지금 무엇을 이해 생각

+2

간단한 재현 가능한 예를 만드십시오. http : // stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example - 우리는 당신이 할 수있을 때 당신의 말로 된 설명을 기반으로 데이터 세트를 만들려고 시간을 낭비 할 것입니다. 공급 코드. – Spacedman

+0

또한 귀하가 시도한 것을 게시하십시오. – shadowtalker

+0

예제가 없으므로'? ave' 함수가 도움이 될지 아니면'? table' 일 수도 있습니다. 그것들을 확인하고 예상되는 출력으로 질문을 재현하십시오. –

답변

2

에 위해

library(data.table) 
setDT(DB1)[, selection_order := .N > 1, by = list(customerID, itemID)] 
DB1 
#  orderItemID orderDate itemID size color customerID selection_order 
# 1:   1 1.1.12  2 l blue   33   TRUE 
# 2:   2 1.1.12  3 s black   15   FALSE 
# 3:   3 1.1.12  2 xl blue   1   FALSE 
# 4:   4 1.1.12  5 xs orange   33   FALSE 
# 5:   5 1.1.12  12 m red   14   FALSE 
# 6:   6 1.1.12  4 s navy   55   FALSE 
# 7:   7 1.1.12  2 l red   33   TRUE 
# 8:   8 1.1.12  3 m purple   78   FALSE 
# 9:   9 2.1.12  1 xxs white   94   FALSE 
# 10:   10 2.1.12  5 xxl black   23   FALSE 

시도 (예에서 중복 기능은 "예"orderItemID 4에서 대신에 "아니오"나에게 줄 것이다) data.frame으로 다시 변환하려면 data.table 버전의 경우 DB1 <- as.data.frame(DB1) (이전 버전의 경우) 또는 setDF(DB1)을 사용하십시오.


당신은 기본 R 너무

transform(DB1, selection_order = ave(itemID, list(customerID, itemID), FUN = function(x) length(x) > 1)) 

와 (덜 효율적으로) 그것을 또는 dplyr 패키지

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

실제로 원하는 결과를 이해할 수있는 유일한 방법은 실제 원하는 출력을 제공하는 것입니다 (단어가 아닌, (데이터 세트를 제공 한 것과 비슷합니다.) –

+0

지금 막 이해할 수 있기를 바랍니다. – Jarvis

+0

Ok, see my 편집하다. 도움이되기를 바랍니다. –

0

를 사용 할 수있는 다음 코드는 새 열을 추가합니다 selection.order 행이 중복 (customerID, itemID) 튜플을 나타내는 경우 데이터 프레임에 적용됩니다. 당신은 제목에서 말한대로 그냥, 하위 집합을 원하는 경우

# 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) 
0

, 다음을 수행하십시오

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

당신이 열을 원하는 경우 :

f <- interaction(DB1$itemID, DB1$customerID) 
DB1$multiple <- table(f)[f] > 1L 

참고 즉 또한 위의 마지막 줄을 단순화하여 실제 카운트를 쉽게 얻을 수 있습니다.

+0

도 작동하지 않습니다. 다른 사용자가 ID를 주문한 경우에도 예를 표시합니다. – Jarvis

+0

이 문제는 동일한 사람이 다음에 하나 이상의 개체를 주문하면 (고객 ID가 공개 된 경우) 다른 사람 (고객 ID)이 동일한 ID를 가진 항목을 주문하면 (itemID가 공개 됨) 나에게 '예'를 표시하고 '아니오'여야합니다. – Jarvis