我正在使用一个识别序列的函数,然后以分钟为单位计算序列的持续时间。当我在最后阶段使用数据结果时,会返回持续时间,但相邻列的返回值为“NA”,而不是最初在这些列中的值
d<-read.table(text='Date.Time Aerial
794 "2012-10-01 08:18:00" 1
795 "2012-10-01 08:34:00" 1
796 "2012-10-01 08:39:00" 1
797 "2012-10-01 08:42:00" 1
798 "2012-10-01 08:48:00" 1
799 "2012-10-01 08:54:00" 1
800 "2012-10-01 08:58:00" 1
801 "2012-10-01 09:04:00" 1
802 "2012-10-01 09:05:00" 1
803 "2012-10-01 09:11:00" 1
1576 "2012-10-01 09:17:00" 2
1577 "2012-10-01 09:18:00" 2
804 "2012-10-01 09:19:00" 1
805 "2012-10-01 09:20:00" 1
1580 "2012-10-01 09:21:00" 2
1581 "2012-10-01 09:23:00" 2
806 "2012-10-01 09:25:00" 1
807 "2012-10-01 09:32:00" 1
808 "2012-10-01 09:37:00" 1
809 "2012-10-01 09:43:00" 1', header=TRUE, stringsAsFactors=FALSE, row.names=1)
#Give correct data type
d$Aerial<- as.numeric(d$Aerial)
d$Date.Time<- as.POSIXct(d$Date.Time)
功能(识别重复天线2的序列和序列的持续时间):
fun1 <- function(data,aerial){
data_above <- 1L*(data$Aerial == aerial)
id_start <- paste(data$Date.Time[which(diff(c(0L,data_above))==1)])
id_end <- paste(data$Date.Time[which(diff(c(data_above,0L))== -1)])
res <- cbind(data[id_start,1:1],Duration=difftime(id_end,id_start, units='mins'))
return(res)
}
fun1(d,2)
返回:
Duration
[1,] NA 1
[2,] NA 2
持续时间是正确的,但我希望它返回应该在相关列中的数据:
Date.Time Duration
[1,] 2012-10-01 09:11:00 1
[2,] 2012-10-01 09:21:00 2
我的实际data.frame有很多列,而不仅仅是Date.Time,它仍然为所有这些返回NA
答案 0 :(得分:2)
我会这样做:
fun1 <- function(data,aerial) {
data_above <- 1L * (data$Aerial == aerial)
id_start <- data$Date.Time[which(diff(c(0L,data_above)) == 1)]
id_end <- data$Date.Time[which(diff(c(data_above, 0L)) == -1)]
res <- cbind(data[data$Date.Time %in% id_start, 1, drop=FALSE],
Duration = difftime(id_end,id_start, units='mins'))
return(res)
}
fun1(d,2)
# Date.Time Duration
# 1576 2012-10-01 09:17:00 1 mins
# 1580 2012-10-01 09:21:00 2 mins
此处需要注意的事项:
当您对data.frame
进行子集并且它只返回1个元素时,执行df[, 1]
将生成向量。使用df[, 1, drop = FALSE
。
传递非data.frame
参数(意思是,cbind
的所有参数都不是data.frames)将导致输出为matrix
。它期望至少有一个参数为data.frame
。所以,如果你不使用drop = FALSE
并且输出结果为1行,那么它将是一个向量,结果将是一个矩阵(见第一点)
我认为您不需要在paste
和id_start
使用id_end
。
访问cbind
data.frame
的{{1}}的第一个参数不正确。您必须在data
的所有值中查询id_start
。可以使用Date.Time
完成,如图所示。
希望这有帮助。