Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/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 - Fatal编程技术网

R 对数据帧进行子集设置会导致意外行为

R 对数据帧进行子集设置会导致意外行为,r,R,我对R很陌生,不知道这个问题是否愚蠢,但我有以下问题: 我有两个数据帧,都包含一个时间戳列(Posixct)。我想将数据子集如下所示: 新的df3应包含df1中的所有列,条件是df2中的“状态”列中出现值“21”。如果发生这种情况,则从df1到df2中的状态21发生前2小时到发生后1小时的所有观察都应在新的df3中 这里是我的原始数据帧的两个示例 df2: timestamp PlantNo State 37 2016-03-14 08:53:25 1

我对R很陌生,不知道这个问题是否愚蠢,但我有以下问题: 我有两个数据帧,都包含一个时间戳列(
Posixct
)。我想将数据子集如下所示: 新的
df3
应包含
df1
中的所有列,条件是
df2
中的“状态”列中出现值“21”。如果发生这种情况,则从
df1
df2
中的状态21发生前2小时到发生后1小时的所有观察都应在新的
df3

这里是我的原始数据帧的两个示例

df2

    timestamp           PlantNo State
37 2016-03-14 08:53:25       1     2
38 2016-03-14 09:31:43       1     0
39 2016-03-14 09:34:43       1     0
40 2016-03-14 13:49:18       1     2
41 2016-03-14 14:17:42       1     0
42 2016-03-14 14:20:41       1     0
43 2016-03-17 01:54:07       1     2
44 2016-03-17 07:06:23       1     0
45 2016-03-17 07:09:23       1     0
46 2016-03-17 10:10:11       1    21
47 2016-03-17 10:46:29       1     2
df1

       timestamp        PlantNo Error avws maxws minws avrot maxrot minrot avpwr
1  2016-03-05 00:00:00       1     0  6.7   9.3   4.3 25.15  30.96  21.37    93
2  2016-03-05 00:10:00       1     0  7.9  11.1   5.5 29.05  34.26  22.89   145
3  2016-03-05 00:20:00       1     0  7.8  10.5   4.6 28.83  33.17  23.34   142
4  2016-03-05 00:30:00       1     0  7.8  10.4   5.3 28.91  33.94  24.09   142
5  2016-03-05 00:40:00       1     0  7.9  10.1   5.4 28.36  32.89  23.03   134
6  2016-03-05 00:50:00       1     0  7.8   9.2   5.4 27.83  31.41  22.48   126
7  2016-03-05 01:00:00       1     0  7.8   9.0   6.6 28.06  30.21  25.87   129
8  2016-03-05 01:10:00       1     0  7.2   9.0   4.7 24.91  29.23   9.92    91
9  2016-03-05 01:20:00       1     0  7.0   8.7   3.9 25.04  28.53  20.39    92
10 2016-03-05 01:30:00       1     0  7.2   9.1   3.7 26.04  30.39  20.75   103
11 2016-03-05 01:40:00       1     0  7.5   9.3   5.1 26.75  30.98  21.80   111
12 2016-03-05 01:50:01       1     0  7.5   8.7   4.9 26.94  28.96  22.46   114
13 2016-03-05 02:00:00       1     0  7.1   9.0   4.4 25.32  30.24  20.38    95
14 2016-03-05 02:10:00       1     0  7.5   9.0   5.0 26.47  29.35  22.85   108
15 2016-03-05 02:20:00       1     0  7.3   9.1   4.2 26.03  30.97  19.43   104
16 2016-03-05 02:30:00       1     0  6.7  10.1   3.9 24.66  30.98  20.06    88
17 2016-03-05 02:40:00       1     0  6.8   9.1   4.5 25.30  30.22  20.88    94
18 2016-03-05 02:50:00       1     0  7.2  10.1   4.2 25.95  31.17  20.74   103
19 2016-03-05 03:00:00       1     0  7.6  10.3   4.3 27.72  34.43  22.19   127
20 2016-03-05 03:10:00       1     0  8.7  12.2   5.3 31.42  35.69  25.32   189
我尝试了以下代码:

df3 <- subset(df1, df1$timestamp > df2$timestamp[df2$State==21]-7200 & 
                   df1$timestamp < df2$timestamp[df2$State==21]+3600) 
最左边的列是
df1
中的观察数。
有人能告诉我我做错了什么吗

只是一个猜测:也许您需要
子集(df1,df1$timestamp>(df2$timestamp[df2$State==21]-7200)&df1$timestamp<(df2$timestamp[df2$State==21]+3600))

也许您的比较
df1$timestamp>(df2$timestamp[df2$State==21]-7200)
。当
df2$State==21
返回多个case时,就是这种情况

尝试以下方法,因为我们没有足够的数据,我不确定是否适合您

inf=df2$timestamp[df2$State==21]-7200
sup=df2$timestamp[df2$State==21]+3600

trs=list()
for (i in 1:length(inf))trs[[i]]=df1$timestamp>inf[i] & df1$timestamp<sup[i]
selv=apply(t(do.call("rbind",trs)),1,any)
df31 <- subset(df1,selv)
inf=df2$timestamp[df2$State==21]-7200
sup=df2$timestamp[df2$State==21]+3600
trs=列表()

对于(i in 1:length(inf))trs[[i]]=df1$timestamp>inf[i]&df1$timestamp,我不确定我是否认为这是一个复杂的问题,但我认为子集不应该这么容易工作

我构建了两个data.frames的示例,其中两个随机时间戳在同一范围内。我使用了一个丑陋的嵌套for循环来检查
df2
中的每个时间戳是否在
state=1
of
df1
的所有时间戳的+-1小时范围内。如果是,则将
state=1
添加到
df2
。为了获得所需的结果,您可以轻松地将df2子集化

set.seed(1)
t1   <- sort(as.POSIXct(sample(1:10000000, 1000) ,origin = "2010-01-01"))
state <- sample(0:1,10000, replace = TRUE, prob = c(0.90,0.05) )
df1 <- data.frame(t1, state)

t2 <- sort(as.POSIXct(sample(1:10000000, 1000) ,origin = "2010-01-01" ))
df2 <- data.frame(t2, ID = 1:length(t2))

df1_h <- df1[df1$state == 1, ]

df2$state <- NA
for (i in 1:nrow(df2)){
  for(j in 1:nrow(df1_h)){
    if(df2$t2[i] > df1_h$t1[j] - 3600 &  df2$t2[i] < df1_h$t1[j] + 3600) df2$state[i] <- 1
  }
} 

df3 <- df2[df2$state == 1, ]
set.seed(1)

T1我觉得一个原始数据与预期输出的样本将比你给我们更容易阅读。考虑包括在你的帖子前10行的<代码> DF1和 DF2不相关的列省略。这对你有帮助吗?我也认为循环是一个子集不起作用的问题。
set.seed(1)
t1   <- sort(as.POSIXct(sample(1:10000000, 1000) ,origin = "2010-01-01"))
state <- sample(0:1,10000, replace = TRUE, prob = c(0.90,0.05) )
df1 <- data.frame(t1, state)

t2 <- sort(as.POSIXct(sample(1:10000000, 1000) ,origin = "2010-01-01" ))
df2 <- data.frame(t2, ID = 1:length(t2))

df1_h <- df1[df1$state == 1, ]

df2$state <- NA
for (i in 1:nrow(df2)){
  for(j in 1:nrow(df1_h)){
    if(df2$t2[i] > df1_h$t1[j] - 3600 &  df2$t2[i] < df1_h$t1[j] + 3600) df2$state[i] <- 1
  }
} 

df3 <- df2[df2$state == 1, ]