我正在尝试创建(在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)
(代码列出两次,一次作为行名,一次作为列)。
如果您有非常大的数据集或需要执行数千次此操作,则后一个版本可能会快一些。