2013-04-22 70 views
1

我再次詢問這類問題道歉,但將R的世界是如此之大,有時我會感到失落,即使我看過一些與R. 相關的最好的書,我有以下DB如何根據其他變量的條件生成二進制變量?

ID=rep((1:3),3) 
x<-as.Date("2013-1-1") 
y<-as.Date("2013-1-2") 
z<-as.Date("2013-1-3") 
DATE<-c(x,x,x,y,x,y,z,z,z) 
TRAP<-c(1,1,1,3,2,3,2,1,3) 
IN<-data.frame(ID,DATE,TRAP) 

,我想以產生根據以下條件的二進制變量(RESULT):如果日期和TRAP是對於不同的ID相同,則結果>ý否則結果> N,這樣

RESULT<-c("y","y","y","y","n","y","n","n","n") 
OUT<-cbind(IN,RESULT) 

我認爲應該使用ifelse函數,但我不知道如何以明確每個ID的平等控制條件... ... 一如既往,每一個建議非常感謝!

+2

很抱歉,但我無法找到背後的'RESULT'邏輯... – juba 2013-04-22 09:51:46

+0

我也沒有,但這似乎很接近:'庫(plyr); IN $ ID2 < - rep(1:3,each = 3); ddply(IN,。(ID2),transform,RESULT =(TRAP == TRAP [1]&DATE == DATE [1]))' – Roland 2013-04-22 09:57:14

+0

@juba,ops last y was wrong in the result,so we have edit the result 。基本上,如果陷阱和日期相同,結果將是y,否則n。我希望我很清楚,對錯誤抱歉! – stefano 2013-04-22 09:57:51

回答

4

這是一種與plyr做到這一點:

R> ddply(IN, .(DATE,TRAP), transform, RESULT=ifelse(length(ID)>1,"y","n")) 
    ID  DATE TRAP RESULT 
1 1 2013-01-01 1  y 
2 2 2013-01-01 1  y 
3 3 2013-01-01 1  y 
4 2 2013-01-01 2  n 
5 1 2013-01-02 3  y 
6 3 2013-01-02 3  y 
7 2 2013-01-03 1  n 
8 1 2013-01-03 2  n 
9 3 2013-01-03 3  n 

注意,行已經重新排序。


data.table另一種解決方案:

R> DT <- data.table(IN) 
R> DT[,RESULT:=ifelse(.N>1,"y","n"), by=list(DATE,TRAP)] 
R> DT 
    ID  DATE TRAP RESULT 
1: 1 2013-01-01 1  y 
2: 2 2013-01-01 1  y 
3: 3 2013-01-01 1  y 
4: 1 2013-01-02 3  y 
5: 2 2013-01-01 2  n 
6: 3 2013-01-02 3  y 
7: 1 2013-01-03 2  n 
8: 2 2013-01-03 1  n 
9: 3 2013-01-03 3  n 

這裏沒有重新排序。


或者使用基本ave

IN <- within(IN, { RESULT <- ave(TRAP, list(DATE, TRAP), 
       FUN= function(x) ifelse(length(x) > 1, "y", "n"))}) 
# ID  DATE TRAP RESULT 
# 1 1 2013-01-01 1  y 
# 2 2 2013-01-01 1  y 
# 3 3 2013-01-01 1  y 
# 4 1 2013-01-02 3  y 
# 5 2 2013-01-01 2  n 
# 6 3 2013-01-02 3  y 
# 7 1 2013-01-03 2  n 
# 8 2 2013-01-03 1  n 
# 9 3 2013-01-03 3  n 
+0

非常感謝你的建議。我不知道包裝plyr,真的很有用!再次感謝! – stefano 2013-04-22 10:16:28

+0

嗨@阿倫,我在想這個問題可能對大家有用(因爲你已經幫助過我這個功能!)......非常感謝! – stefano 2013-04-22 10:21:52

+0

@Arun感謝您的基礎解決方案和編輯。你可以發佈antoher答案,因爲我現在不能upvote你:) – juba 2013-04-22 10:35:13

1

您可以使用duplicated此:

IN$RESULT <- ifelse((duplicated(IN[,2:3])+duplicated(IN[,2:3],fromLast=TRUE))>0, 
         "y","n") 

# ID  DATE TRAP RESULT 
# 1 1 2013-01-01 1  y 
# 2 2 2013-01-01 1  y 
# 3 3 2013-01-01 1  y 
# 4 1 2013-01-02 3  y 
# 5 2 2013-01-01 2  n 
# 6 3 2013-01-02 3  y 
# 7 1 2013-01-03 2  n 
# 8 2 2013-01-03 1  n 
# 9 3 2013-01-03 3  n 
+0

很高興知道這個其他有用的功能!我感謝你的幫助。 – stefano 2013-04-23 11:25:05

相關問題