r - cbind 在特定列中返回 NA 的函数

标签 r time-series sequences

我正在使用一个函数来识别序列,然后计算序列的持续时间(以分钟为单位)。当我在最后阶段将结果与数据绑定(bind)时,返回持续时间,但相邻列返回“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

最佳答案

我会这样做:

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_startid_end .

  • cbind 的第一个参数您可以在哪里访问 data.frame data是不正确的。您必须查询 id_startDate.Time 的所有值内。可以使用 %in% 来完成如图所示。

希望这有帮助。

关于r - cbind 在特定列中返回 NA 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15707948/

相关文章:

r - 了解 ROCR 的 performance() 函数返回的内容 - 在 R 中的分类

java - 时间序列预测 encog 3 java 从 CSV 读取

r - foverlaps 和 data.table 中的内容

python - 如何编写斐波那契数列?

用于 Visual Studio 的 R 工具未在 VS2017 中正确安装

r - ggforce facet_zoom - 仅在缩放示例上标记

r - 解释套索回归 p 值与系数

python - 在 python 中绘制 YoY 价格相关性。 (绘制 Dataframe 行的相关性)

MySQL id序列

clojure - 如何在Clojure中合并两个序列?