使用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