我有一个名为Categories的因子向量,含有47个级别
Categories = as.factor(sort(make.unique(rep(letters, length.out = 47), sep='')))
[1] a a1 b b1 c c1 d d1 e e1 f f1 g g1 h h1 i i1 j j1 k k1 l l1 m m1 n n1 o o1 p p1 q q1 r r1 s s1 t
[40] t1 u u1 v w x y z
47 Levels: a a1 b b1 c c1 d d1 e e1 f f1 g g1 h h1 i i1 j j1 k k1 l l1 m m1 n n1 o o1 p p1 q q1 r r1 s s1 t t1 u u1 ... z
我有另一个名为cat的向量,其中有9个级别
cat = Categories[c(7,42,43,24,45,26,35,6,15)]
[1] d u1 v l1 x m1 r c1 h
47 Levels: a a1 b b1 c c1 d d1 e e1 f f1 g g1 h h1 i i1 j j1 k k1 l l1 m m1 n n1 o o1 p p1 q q1 r r1 s s1 t t1 u u1 ... z
我还有一个包含36行的数据帧My_Data。数据框中的一列具有多个来自cat
的值的出现My_Data = data.frame(name = make.unique(rep(c(1:10,LETTERS), length.out = 36), sep=''), cat = sample(rep(cat,4),36,replace = FALSE), position = 0)
name cat position
1 1 v 0
2 2 r 0
3 3 h 0
4 4 m1 0
5 5 h 0
6 6 u1 0
7 7 l1 0
8 8 h 0
9 9 u1 0
10 10 x 0
11 A x 0
12 B v 0
13 C d 0
14 D c1 0
15 E r 0
16 F v 0
17 G l1 0
18 H d 0
19 I l1 0
20 J c1 0
21 K u1 0
22 L x 0
23 M v 0
24 N d 0
25 O l1 0
26 P m1 0
27 Q r 0
28 R m1 0
29 S h 0
30 T m1 0
31 U c1 0
32 V d 0
33 W r 0
34 X x 0
35 Y c1 0
36 Z u1 0
使用下面的代码,我可以填充上面给出的位置列,以反映cat列中值的出现次数:
transform(My_Data, position = ave(as.character(cat), cat, FUN = seq_along))
数据帧My_Data的前15行看起来像:
name cat position
1 1 v 1
2 2 r 1
3 3 h 1
4 4 m1 1
5 5 h 2
6 6 u1 1
7 7 l1 1
8 8 h 3
9 9 u1 2
10 10 x 1
11 A x 2
12 B v 2
13 C d 1
14 D c1 1
15 E r 2
现在我想计算分钟。最多在cat列的相同值的任何2次连续出现之间的介入项目数。
我该怎么做?
答案 0 :(得分:0)
如果我理解你的问题,这里有一个选项:
library(tidyverse)
# Data
Categories = as.factor(sort(make.unique(rep(letters, length.out = 47), sep='')))
cat = Categories[c(7,42,43,24,45,26,35,6,15)]
# Set a seed for reproducibility
set.seed(5)
My_Data = data.frame(name = make.unique(rep(c(1:10,LETTERS), length.out = 36), sep=''),
cat = sample(rep(cat,4),36,replace = FALSE),
position = 0)
以下代码总结了每个cat
级别的最小和最大干预行数。
# Summarise to give min and max number rows between each occurrence
My_Data %>%
mutate(row=1:n()) %>%
group_by(cat) %>%
summarise(min.diff=min(diff(row)-1, na.rm=TRUE),
max.diff=max(diff(row)-1, na.rm=TRUE))
cat min.diff max.diff <fctr> <dbl> <dbl> 1 c1 4 6 2 d 1 16 3 h 1 16 4 l1 0 13 5 m1 0 12 6 r 5 15 7 u1 2 7 8 v 1 16 9 x 6 12
如果要标记原始数据框中的中间行数:下面的代码在原始数据框中添加一列,以给出自上次出现给定级别{{1}以来的中间行数}。
cat
# Add column with intervening number of rows between each occurrence in cat My_Data %>% mutate(row=1:n()) %>% group_by(cat) %>% mutate(diff=c(NA,diff(row)-1)) %>% select(-row)
答案 1 :(得分:0)
以下是使用lag()
:
library(tidyverse)
# create data frame
set.seed(1)
Categories <- as.factor(sort(make.unique(rep(letters, length.out = 47), sep='')))
cat <- Categories[c(7,42,43,24,45,26,35,6,15)]
My_Data <- data.frame(
name = make.unique(rep(c(1:10,LETTERS), length.out = 36), sep=''),
cat = sample(rep(cat,4),36,replace = FALSE),
position = 0
)
# solution
My_Data %>%
mutate(row = 1:n()) %>%
group_by(cat) %>%
mutate(inter = row - lag(row) - 1) %>%
summarize(min_inter = min(inter, na.rm = T), max_inter = max(inter, na.rm = T))
结果:
# A tibble: 9 x 3
cat min_inter max_inter
<fctr> <dbl> <dbl>
1 c1 0 10
2 d 4 11
3 h 0 8
4 l1 0 6
5 m1 1 3
6 r 0 16
7 u1 2 5
8 v 1 23
9 x 6 15