我认为您可以使用arrange() 和slice() 来查找数据中的第一个/最后一个链接。我的解决方案比 @arg0naut91 的解决方案更长,但可能更直观。
创建玩具数据框...
df <- data.frame(group=rep(letters,3), # create toy data frame
sequence=rep(1:3,26),
link=sample(9:13,78,T)) %>%
arrange(group,sequence) %>% # arrange data
group_by(group,link) %>% sample_n(1) %>% # remove any duplicate link values (to create uneven sequence var)
ungroup() %>% arrange(group,sequence) # arrange again to view
glimpse(df)
查找第一个和最后一个链接。将它们作为新列添加到数据框中。
df <- df %>% arrange(group,link) %>% group_by(group) %>%
slice(1) %>% mutate(link.first=link) %>% # find first link for each group
select(group,link.first) %>% left_join(df,.) # add to original data frame
df <- df %>% arrange(group,link) %>% group_by(group) %>%
slice(n()) %>% mutate(link.last=link) %>% # find last link for each group
select(group,link.last) %>% left_join(df,.) # add to original data frame
df %>% mutate(key=paste(link.first,link.last,sep=', ')) # paste links to form key
# A tibble: 62 x 6
group sequence link link.first link.last key
<fct> <int> <int> <int> <int> <chr>
1 a 1 10 10 12 10, 12
2 a 2 12 10 12 10, 12
3 b 2 9 9 11 9, 11
4 b 3 11 9 11 9, 11
5 c 1 13 9 13 9, 13
6 c 2 12 9 13 9, 13
7 c 3 9 9 13 9, 13
8 d 1 9 9 13 9, 13
9 d 3 13 9 13 9, 13
10 e 1 11 9 11 9, 11
由于我使用sample() 替换生成数据,可能有一些group 只有一行(即相同的第一个和最后一个链接值),可以过滤掉。
df %>% filter(link.first==link.last)
# A tibble: 2 x 5
group sequence link link.first link.last
<fct> <int> <int> <int> <int>
1 k 2 9 9 9
2 z 1 9 9 9
df %>% count(group) %>% filter(n==1)