将分组变量的第一个和最后一个值粘贴在一起

时间:2019-07-15 11:52:07

标签: r dataframe data.table tidyverse

我有一个如下所示的df:

group sequence link 
90      1      11|S1
90      2      10|S1
90      3      12|10
91      1      9|10
91      2      13|9
93      1      15|20
...

如何将每个组中link变量的第一个和最后一个值存储为新变量? 所需的输出是:

group sequence link  Key
90      1      11|S1 11|S1, 12|10
90      2      10|S1 11|S1, 12|10
90      3      12|10 11|S1, 12|10
91      1      9|10  9|10, 13|9
91      2      13|9 9|10,13|9
93      1      15|20 
....

2 个答案:

答案 0 :(得分:2)

您可以这样做:

df = {'First' : [30, 22, 18, 49, 22], 'Second' : [80, 28, 16, 56, 30], 'Third' : [14, None, None, 30, 27], 'Fourth' : [14, 85, 17, 22, 14], 'Fifth' : [22, 33, 45, 72, 11]}
df = pd.DataFrame(df, columns = ['First', 'Second', 'Third', 'Fourth'])    

尽管这与您想要的输出不匹配。在示例数据框中,例如library(dplyr) df %>% group_by(group) %>% mutate( Key = paste(link[1], link[n()], sep = ", ") ) 组中只有1个值。上面的代码会反复给您91作为开始和结束。

在这种情况下,如果您只想显示一个值,则可以执行以下操作:

9|10

答案 1 :(得分:0)

我认为您可以使用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)