R 计算列中两个定义值之间出现的特定值数

R 计算列中两个定义值之间出现的特定值数,r,function,dataframe,R,Function,Dataframe,我有一个数据帧: value open id1 id1 id2 close open open close open id1 id2 close open id1 id1 close close open close open id1 id2 id2 id2 close 我怎么能这么做?我不应该在“开放”而不考虑“关闭”的情况下,或者在它之前有“关闭”,而没有“打开”。 这里请下次给我们一些。下面的内容符合您的要求 value <- c("open", &qu

我有一个数据帧:

   value
open
id1
id1
id2
close
open
open
close
open
id1
id2
close
open
id1
id1
close
close
open
close
open
id1
id2
id2
id2
close
我怎么能这么做?我不应该在“开放”而不考虑“关闭”的情况下,或者在它之前有“关闭”,而没有“打开”。
这里请下次给我们一些。下面的内容符合您的要求

value <- c("open", 
"id1",
"id1",
"id2",
"close",
"open",
"open",
"close",
"open",
"id1",
"id2",
"close",
"close")
openid <- which(value == "open")
closeid <- which(value == "close")
id1 <- sapply(1:length(openid), function(x) sum("id1"==value[openid[x]:closeid[x]]))
id2 <- sapply(1:length(openid), function(x) sum("id2"==value[openid[x]:closeid[x]]))
> id1;id2
[1] 2 0 1 1
[1] 1 0 1 1

下面是一个解决问题的
tidyverse
方法。您可以在向量中创建以“打开”开头的组,并且仅包括也存在“关闭”的组。然后,
slice
分析“关闭”之前出现的ID。接下来,
汇总
,以获取每个组的ID数

我添加了
complete
,这样对于那些只有“open”和“close”且中间没有ID的人来说,计数为零

library(tidyverse)

data.frame(val = df) %>%
  group_by(grp = cumsum(val == "open")) %>%
  filter(any(val == "close")) %>%
  slice(seq_len(min(which(val == "close"), n()))) %>%
  group_by(grp, val) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  complete(grp, val, fill = list(count = 0)) %>%
  filter(val != "open" & val != "close") %>%
  dplyr::select(-grp)
输出

   val   count
   <chr> <dbl>
 1 id1       0
 2 id2       0
 3 id1       6
 4 id2      26
 5 id1       6
 6 id2      36
 7 id1       2
 8 id2      19
 9 id1       1
10 id2      20
11 id1       2
12 id2      14
13 id1       6
14 id2      26
15 id1       6
16 id2      20
17 id1       3
18 id2      26
19 id1       4
20 id2      13
21 id1       2
22 id2       9
23 id1       6
24 id2      26
val计数
1 ID10
2 id2 0
3 ID16
4 id2 26
5 ID16
6 id2 36
7 id1 2
8 id2 19
9 id1 1
10 id2 20
11 id1 2
12 id2 14
13 ID16
14 id2 26
15 ID16
16 id2 20
17 id1 3
18 id2 26
19 id1 4
20 id2 13
21 id1 2
22 id2 9
23 id1 6
24 id2 26

它在openid[x]:closeid[x]:NA/NaN参数中表示错误,这可能是因为在
openid
closeid
中有
NA
。用我的数据,它是有效的。如果你提供了玩具数据,我就可以用你的玩具数据了。检查您的数据中是否有
Open
而不是
Open
,或者检查向量名称实际上是
value
当然……我添加了一个可复制的向量值示例不,这不是一个可复制的示例。它应该包含
。这一点很重要,因为这意味着您尚未尝试解决此数据的问题。请先尝试解决您的问题,然后告诉我它是否有效
df <- c("id1", "id1", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "open", "close", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id1", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "open", "id1", "id1", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id2", "id2", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id2", "id2", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id1", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id1", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id2", "id2", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id1", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id2", "id2", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open", "id1", "id1", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id1", "id1", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "id2", "close", "open")
openid <- which(value == "open")
closeid <- which(value == "close")
id1 <- sapply(1:length(openid), function(x) sum("id1"==value[openid[x]:closeid[x]]))
id2 <- sapply(1:length(openid), function(x) sum("id2"==value[openid[x]:closeid[x]]))                                                              
> id2
[1] 1 0 1 1
> id1
[1] 2 0 1 1
> openid
[1] 1 6 7 9
> closeid
[1]  5  8 12 13
library(tidyverse)

data.frame(val = df) %>%
  group_by(grp = cumsum(val == "open")) %>%
  filter(any(val == "close")) %>%
  slice(seq_len(min(which(val == "close"), n()))) %>%
  group_by(grp, val) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  complete(grp, val, fill = list(count = 0)) %>%
  filter(val != "open" & val != "close") %>%
  dplyr::select(-grp)
   val   count
   <chr> <dbl>
 1 id1       0
 2 id2       0
 3 id1       6
 4 id2      26
 5 id1       6
 6 id2      36
 7 id1       2
 8 id2      19
 9 id1       1
10 id2      20
11 id1       2
12 id2      14
13 id1       6
14 id2      26
15 id1       6
16 id2      20
17 id1       3
18 id2      26
19 id1       4
20 id2      13
21 id1       2
22 id2       9
23 id1       6
24 id2      26