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