我正在尝试创建(在R中)遇到的历史记录,以便在RMark中使用;即,如果发生了相遇,则返回“ 1”;如果未发生相遇,则返回“ 0”。

样本数据:

zm <- structure(list(date.time = structure(c(1365905306, 1365919237,
1365923863, 1365929487, 1365931725, 1365942003, 1365945361, 1366143204,
1366159355, 1366159863, 1366164285, 1366202496, 1366224357, 1366238428,
1366243685, 1366250254, 1366252570, 1366314236, 1366315282, 1366386242
), class = c("POSIXct", "POSIXt"), tzone = ""), station = c("M1",
"M2", "M2", "M3", "M4", "M3", "M4", "M7", "L1", "M1", "M2", "M2",
"L4", "M2", "M2", "M3", "M4", "M1", "M2", "M1"), code = c(10908,
10908, 10897, 10908, 10908, 10897, 10897, 10908, 10908, 10914,
10914, 10916, 10908, 10917, 10910, 10917, 10917, 10913, 10913,
10896)), .Names = c("date.time", "station", "code"), row.names = c(5349L,
51L, 60L, 7168L, 65L, 7178L, 70L, 6968L, 8647L, 5362L, 79L, 94L,
9027L, 96L, 105L, 7200L, 114L, 5382L, 123L, 5388L), class = "data.frame")


可能的遭遇历史记录(检查是否发生遭遇的站点):

rec<- c("M1", "M2","M3","M4","M5","M6","M7")


重要的是,遭遇历史记录输出引用上面rec的顺序。

因此,对于每个code,我想查看是否在第一个站点上检测到它,即"M1",如果是,则返回“ 1”,然后查看是否在第二个站点"M2"上检测到它,如果没有返回一个“ 0”;最终将以0和1的字符串结尾。

我可以通过以下方式获取rec中的数据:

library("plyr")
zm2 <- ddply(zm, c("code"), function(df)
 data.frame(arrive=(df[which(df$station %in% rec),])))


但是我不确定如何按rec的顺序运行它,然后返回“ 0”或“ 1”。

最终,我想要一个data.frame输出结构如下:

ch       code
00101    1
00011    2


等等...

最佳答案

table()确实是可行的方法,然后按paste0()将表折叠成字符串。 (感谢可复制的示例!)

rec <- sort(unique(zm$station))
cfun <- function(x) {
    tab <- with(x,table(factor(station,levels=rec)))
    data.frame(ch=paste0(as.numeric(tab),collapse=""))
}
library(plyr)
ddply(zm,"code",cfun)
##    code      ch
## 1 10896 0010000
## 2 10897 0001110
## 3 10908 1111111
## 4 10910 0001000
## 5 10913 0011000
## 6 10914 0011000
## 7 10916 0001000
## 8 10917 0001110


或@alexis_laz建议:

tab2 <- with(zm,table(code,station))
ctab <- apply(tab2,1,paste0,collapse="")
data.frame(code=names(ctab),ch=ctab)


(代码列出两次,一次作为行名,一次作为列)。
如果您有非常大的数据集或需要执行数千次此操作,则后一个版本可能会快一些。

08-19 19:52