1

再次为提出此类问题道歉,但 R 世界如此之大,有时我会感到迷茫,即使我已经阅读了一些与 R 相关的最佳书籍。我有以下数据库

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):如果不同ID的DATE和TRAP相同,则RESULT>y否则RESULT>n,像这样

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

我认为ifelse应该使用该函数,但我不知道如何明确控制每个 ID 的相等条件......一如既往,非常感谢每一个建议!

4

2 回答 2

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

这里没有重新排序。


或使用 base 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
于 2013-04-22T10:02:11.007 回答
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
于 2013-04-22T10:51:05.943 回答