2013-04-22 43 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

相关问题