Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较多行中的日期,如果满足R中的条件,则替换值_R_Date_Datetime_Comparison_Row - Fatal编程技术网

比较多行中的日期,如果满足R中的条件,则替换值

比较多行中的日期,如果满足R中的条件,则替换值,r,date,datetime,comparison,row,R,Date,Datetime,Comparison,Row,我有几个个体(ID)的一组日期和时间,对应于我们的主要结果测量(Y)和一个协变量(X1) 我的目标是,如果X1测量值是在测量Y变量的日期/时间起的+/-24小时内记录的,则替换每个Y行缺少的X1值。为了便于可视化(并加载到R中),以下是数据当前的排列方式: structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), TIME = structure(1:15, .Label = c("01

我有几个个体(
ID
)的一组日期和时间,对应于我们的主要结果测量(
Y
)和一个协变量(
X1

我的目标是,如果
X1
测量值是在测量
Y
变量的日期/时间起的+/-24小时内记录的,则替换每个
Y
行缺少的
X1
值。为了便于可视化(并加载到R中),以下是数据当前的排列方式:

structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), TIME = structure(1:15, .Label = c("01/01/2013 12:01", 
"01/03/2013 08:49", "01/03/2013 20:52", "02/01/2013 05:00", "02/03/2013 05:30", 
"02/03/2013 21:14", "02/05/2013 05:15", "02/12/2013 05:03", "02/15/2013 04:16", 
"02/16/2013 04:12", "02/16/2013 21:02", "03/01/2010 17:58", "03/02/2010 00:10", 
"03/03/2010 10:45", "03/04/2010 09:00"), class = "factor"), Y = structure(c(1L, 
5L, 7L, 1L, 1L, 2L, 1L, 1L, 1L, 4L, 3L, 1L, 8L, 1L, 6L), .Label = c(".", 
"22", "35", "4", "5", "6", "8", "9"), class = "factor"), X1 = structure(c(2L, 
1L, 1L, 7L, 7L, 1L, 4L, 4L, 3L, 1L, 1L, 6L, 1L, 5L, 1L), .Label = c(".", 
"0.1", "0.2", "0.4", "0.6", "0.9", "1.0"), class = "factor")), .Names = c("ID", 
"TIME", "Y", "X1"), class = "data.frame", row.names = c(NA, -15L))
为了简化所需的输出,我只想显示具有非缺失
Y
值的行,这样最终产品将如下所示:

  ID             TIME  Y  X1
1  1 01/03/2013 08:49  5   .
2  1 01/03/2013 20:52  8   .
3  2 02/03/2013 21:14 22   .
4  2 02/16/2013 04:12  4 0.2
5  2 02/16/2013 21:02 35   .
6  3 03/02/2010 00:10  9 0.9
7  3 03/04/2010 09:00  6 0.6
是否可以(1)迭代多行并计算24小时的绝对值,以获得
X1
Y
测量值之间的差异,以及(2)用+/-24小时窗口内的值替换
X1
的缺失值


任何关于如何进行这方面的想法都将不胜感激

如果您将数据转换为
xts
,那么您可以使用xts的轻松子集功能来获取所需内容

PS:如果在Y测量的24小时内X1值正好为1,则以下代码将起作用

require(xts)
xx <- xts(DF[, c(1, 4, 5)], as.POSIXct(paste0(DF$Date, " ", DF$TIME), format = "%m/%d/%Y %H:%M"))


sapply(index(xx[!is.na(xx$Y)]), FUN = function(tt) {
    startTime <- tt - 24 * 60 * 60
    endTime <- tt + 24 * 60 * 60
    y <- xx[paste(startTime, endTime, sep = "/")]
    if (nrow(y[!is.na(y$X1), "X1"]) != 0) {
        return(as.vector(y[!is.na(y$X1), "X1"]))
    } else {
        return(NA)
    }

})
## [1] 0.9 0.6  NA  NA 1.0 0.2  NA


xx[!is.na(xx$Y), "X1"] <- sapply(index(xx[!is.na(xx$Y)]), FUN = function(tt) {
    startTime <- tt - 24 * 60 * 60
    endTime <- tt + 24 * 60 * 60
    y <- xx[paste(startTime, endTime, sep = "/")]
    if (nrow(y[!is.na(y$X1), "X1"]) != 0) {
        return(as.vector(y[!is.na(y$X1), "X1"]))
    } else {
        return(NA)
    }

})

xx[!is.na(xx$Y), "X1"]
##                      X1
## 2010-03-02 00:10:00 0.9
## 2010-03-04 09:00:00 0.6
## 2013-01-03 08:49:00  NA
## 2013-01-03 20:52:00  NA
## 2013-02-03 21:14:00 1.0
## 2013-02-16 04:12:00 0.2
## 2013-02-16 21:02:00  NA
require(xts)

xx如果在缺少
X1
的24小时内有多个
X1
值,该怎么办?使用
dput
在帖子中添加一个值是很有礼貌的。输出第三行的0.2从何而来?我很抱歉——你完全正确。第三行中的“0.2”错误,应更改为缺少“”。这个问题现在已经解决了。我为我手动查看这些内容所引起的混乱表示歉意。显然,我需要一个算法解决方案…如果在24小时内有超过1个
X1
值,我会选择时间上最接近
Y
测量值的值。这看起来非常好——谢谢!在最后一步中,我们尝试删除缺少的Y值时,我得到以下错误:
xx[!is.na(xx$Y),“X1”]中的错误:维数不正确
。还有第二个警告,内容也是:
In is.na(xx$Y):is.na()应用于“NULL”类型的非-(列表或向量)
。你知道我怎样才能复制你的结果吗?谢谢