是的,
对于一组观察,我有响应事件的日期。
structure(list(Date1_P2 = structure(c(14061, 14944, 14944), class = "Date"),
Date2_P2 = structure(c(NA, 11566, 11747), class = "Date"),
Date3_P2 = structure(c(NA, 10408, 11627), class = "Date"),
Date4_P2 = structure(c(NA, 8370, 11566), class = "Date")), .Names = c("Date1_P2",
"Date2_P2", "Date3_P2", "Date4_P2"), row.names = c(NA, 3L), class = "data.frame")
> dates
Date1_P2 Date2_P2 Date3_P2 Date4_P2
1 2008-07-01 <NA> <NA> <NA>
2 2010-12-01 2001-09-01 1998-07-01 1992-12-01
3 2010-12-01 2002-03-01 2001-11-01 2001-09-01
如果这些日期中的任何一个在触发事件的范围内,我想创建一个TRUE
变量。比方说,2001年9月发生了一些观察结果本可以回应或预期的事情。我已经编写了以下函数,
checkmove <- function(event, range, moves){
moves <- as.numeric(moves)
early <- as.numeric(event - range)
late <- as.numeric(event + range)
moved <- any(moves > early & moves < late, na.rm=TRUE)
return(moved)
}
如果事件的任何一方在180天内都有响应,则该值应为TRUE
。这个函数一行一行地工作,但我无法使它在整张表上工作。
# This is right
> checkmove(as.Date("2001-09-01"), 180, dates[1,])
[1] FALSE
> checkmove(as.Date("2001-09-01"), 180, dates[2,])
[1] TRUE
> checkmove(as.Date("2001-09-01"), 180, dates[3,])
[1] TRUE
# This is wrong
> apply(dates, 1, function(x) checkmove(as.Date("2001-09-01"), 180, x))
1 2 3
FALSE FALSE FALSE
Warning messages:
1: In checkmove(as.Date("2001-09-01"), 180, x) :
NAs introduced by coercion
2: In checkmove(as.Date("2001-09-01"), 180, x) :
NAs introduced by coercion
3: In checkmove(as.Date("2001-09-01"), 180, x) :
NAs introduced by coercion
我没有使用正确的apply
函数吗?我真的宁愿避免for
循环。有没有更好的方法可以从一开始就解决这个问题?
apply
强制类matrix
中的数据帧dates
。因此这些值不再是类别CCD_ 8而是CCD_。因此as.numeric
"不"起作用(强制引入的NA)。
> dates
Date1_P2 Date2_P2 Date3_P2 Date4_P2
1 2008-07-01 <NA> <NA> <NA>
2 2010-12-01 2001-09-01 1998-07-01 1992-12-01
3 2010-12-01 2002-03-01 2001-11-01 2001-09-01
> apply(dates, 1, function(x) class(x))
1 2 3
"character" "character" "character"
尝试使用包plyr
中的"ddply"系列。例如
> library(plyr)
> aaply(dates, 1, function(x) checkmove(as.Date("2001-09-01"), 180, x), .expand=F)
1 2 3
FALSE TRUE TRUE