使用dplyr中的相同编号对相同分组值进行编号

使用dplyr中的相同编号对相同分组值进行编号,r,dplyr,R,Dplyr,我有一个数据帧示例: x <- data.frame(x = c(1, 1, 2, 2, 3, 3, 4, 4, 1), y = c("a", "a", "b", "b", "c", "c", "d", "d", "z")) 然而,我想要的是用相同的数字对x$x和x$y的相同组合进行编号,例如 x y id 1 a 1 1 a 1 2 b 1 2 b 1 3 c 1 3 c 1 4 d 1 4 d 1 1 z 2 因此,其中c(x$x

我有一个数据帧示例:

x <- data.frame(x = c(1, 1, 2, 2, 3, 3, 4, 4, 1), 
                y = c("a", "a", "b", "b", "c", "c", "d", "d", "z"))
然而,我想要的是用相同的数字对
x$x
x$y
的相同组合进行编号,例如

x y id
1 a  1
1 a  1
2 b  1
2 b  1
3 c  1
3 c  1
4 d  1
4 d  1
1 z  2
因此,其中
c(x$x[1],x&y[1])==c(x$x[2],x$y[2])==c(x$x[n],x$y[n]
在新列中获得相同的值

如何在
dplyr
中执行此操作

x          %>% 
arrange(x) %>% 
mutate(xid = lag(x$x, default = 1), 
       yid = lag(as.character(x$y), default = "a")) %>% 
group_by(x) %>%
mutate(id = cumsum(x != xid | as.character(y) != yid) + 1) %>% 
mutate(xid = NULL, yid = NULL)
这将产生:

      x      y    id
  <dbl> <fctr> <dbl>
1     1      a     1
2     1      a     1
3     1      z     2
4     2      b     1
5     2      b     1
6     3      c     1
7     3      c     1
8     4      d     1
9     4      d     1
xy-id
1 a 1
2 1 a 1
3 1 z 2
4 2 b 1
5 2 b 1
6 3 c 1
7 3 c 1
8 4 d 1
9 4 d 1

另一个可能的选项:

library(dplyr)

x <- data_frame(x = c(1, 1, 2, 2, 3, 3, 4, 4, 1), 
                y = c("a", "a", "b", "b", "c", "c", "d", "d", "z"))

x %>% 
  group_by(x,y) %>% 
  summarise(y_list = list(y)) %>% 
  group_by(x) %>% 
  mutate(id = row_number()) %>% 
  tidyr::unnest() %>% 
  select(-y_list)

#output
      x     y    id
  <dbl> <chr> <int>
1     1     a     1
2     1     a     1
3     1     z     2
4     2     b     1
5     2     b     1
6     3     c     1
7     3     c     1
8     4     d     1
9     4     d     1
库(dplyr)
x%
(x,y)%>%
总结(y_列表=列表(y))%>%
分组依据(x)%>%
变异(id=行号())%>%
tidyr::unnest()%>%
选择(-y_列表)
#输出
x y id
1 a 1
2 1 a 1
3 1 z 2
4 2 b 1
5 2 b 1
6 3 c 1
7 3 c 1
8 4 d 1
9 4 d 1

这里是另一个使用系数的解决方案:

## levels=unique(y) is so that levels of y are numbered according to their order of appearance and not alphabetical order
df %>% group_by(x) %>% mutate(id=as.numeric(factor(y,levels=unique(y))))
它返回:

  x     y     id
  <dbl> <chr> <dbl>
1     1     a     1
2     1     a     1
3     2     b     1
4     2     b     1
5     3     c     1
6     3     c     1
7     4     d     1
8     4     d     1
9     1     z     2
xy-id
1 a 1
2 1 a 1
3 2 b 1
4 2 b 1
5 3 c 1
6 3 c 1
7 4 d 1
8 4 d 1
9 1 z 2

我们可以使用的另一个选项是
match

library(dplyr)
x %>% 
   group_by(x) %>% 
   mutate(id = match(y, unique(y)))
# A tibble: 9 x 3
# Groups: x [4]
#      x      y    id
#  <dbl> <fctr> <int>
#1     1      a     1
#2     1      a     1
#3     2      b     1
#4     2      b     1
#5     3      c     1
#6     3      c     1
#7     4      d     1
#8     4      d     1
#9     1      z     2
库(dplyr)
x%>%
分组依据(x)%>%
变异(id=match(y,unique(y)))
#一个tibble:9x3
#组别:x[4]
#x y id
#    
#1 a 1
#2 1 a 1
#3 2 b 1
#4 2 b 1
#5 3 c 1
#6 3 c 1
#7 4 d 1
#8 4 d 1
#9 1 z 2

你的意思是与前一行相同的组合?还是彼此相同(即
x$x==x$y
)?
x%>%group\u by_all()%%>%filter(n()==2)
@akash87我更新了这个问题(希望!)一个更好的数据框架和更好的问题。
library(dplyr)
x %>% 
   group_by(x) %>% 
   mutate(id = match(y, unique(y)))
# A tibble: 9 x 3
# Groups: x [4]
#      x      y    id
#  <dbl> <fctr> <int>
#1     1      a     1
#2     1      a     1
#3     2      b     1
#4     2      b     1
#5     3      c     1
#6     3      c     1
#7     4      d     1
#8     4      d     1
#9     1      z     2