R-特定组中数据框中行的特定合并

时间:2018-09-08 17:37:36

标签: r reshape

我在R中有一个巨大的数据框,如下所示:

df <- data.frame("ITEM" = c(1,1,1,2,2,3,3,3,3,4),
                 "ID" = c("A","B","C","D","E","F","G","A","B","C"),
                 "Score" = c(7,8,7,3,5,4,6,9,10,5), 
                 "Date" = = c("1/1/2018","1/3/2018","1/6/2018","1/7/2017","1/10/2017","1/1/2003","1/3/2004","1/5/2008","1/7/2010","1/8/2010"))

    ITEM ID Score  Date
 1     1  A     7  1/1/2018
 2     1  B     8  1/3/2018
 3     1  C     7  1/6/2018
 4     2  D     3  1/7/2017
 5     2  E     5  1/10/2017
 6     3  F     4  1/1/2003
 7     3  G     6  1/3/2004
 8     3  A     9  1/5/2008
 9     3  B    10  1/7/2010
10     4  C     5  1/8/2010
11     4  H     8  1/3/2011

数据已经按唯一项分组,并且按升序排列。我想将数据转置为以下内容:

    ITEM ID Score  Date     ID_2 Score_2 Date_2
 1     1  A     7  1/1/2018  B     8     1/3/2018   
 2     1  B     8  1/3/2018  C     7     1/6/2018
 4     2  D     3  1/7/2017  E     5     1/10/2017
 6     3  F     4  1/1/2003  G     6     1/3/2004
 7     3  G     6  1/3/2004  A     9     1/5/2008
 8     3  A     9  1/5/2008  B     10    1/7/2010
10     4  C     5  1/8/2010  H     8     1/3/2011

每个项目都有一个所有者,并转移给另一个人并获得一个分数。例如。项目1由得分为7的A持有,然后移至得分为8的B,然后得分为7的C。

我想以上述格式获取它...将每行与上面的行合并(但在项目组内)-我尝试使用dcast根据我所知道的方法重塑数据,但是您会得到ID_3, ID_4列也用于某些项目,而我只希望ID_2,Score_2和Date_2列。

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:3)

基于预期的输出,我们可以通过'ITEM'SwitchNavigatorsplit行与cbind行,然后转换lag的data.frame到带有list的单个data.frame

rbind

或使用out <- do.call(rbind, lapply(split(df, df$ITEM), function(x) cbind(x[-nrow(x), ], x[-1, -1]))) row.names(out) <- NULL out # ITEM ID Score Date ID Score Date #1 1 A 7 1/1/2018 B 8 1/3/2018 #2 1 B 8 1/3/2018 C 7 1/6/2018 #3 2 D 3 1/7/2017 E 5 1/10/2017 #4 3 F 4 1/1/2003 G 6 1/3/2004 #5 3 G 6 1/3/2004 A 9 1/5/2008 #6 3 A 9 1/5/2008 B 10 1/7/2010 #7 4 C 5 1/8/2010 H 8 1/3/2011

tidyverse

数据

library(tidyverse)
df %>% 
   group_by(ITEM) %>% 
   nest %>%
   mutate(data = map(data, ~ bind_cols(.x[-nrow(.x), ], .x[-1, ]))) %>% 
   unnest
# A tibble: 7 x 7
#   ITEM ID    Score Date     ID1   Score1 Date1    
#  <int> <chr> <int> <chr>    <chr>  <int> <chr>    
#1     1 A         7 1/1/2018 B          8 1/3/2018 
#2     1 B         8 1/3/2018 C          7 1/6/2018 
#3     2 D         3 1/7/2017 E          5 1/10/2017
#4     3 F         4 1/1/2003 G          6 1/3/2004 
#5     3 G         6 1/3/2004 A          9 1/5/2008 
#6     3 A         9 1/5/2008 B         10 1/7/2010 
#7     4 C         5 1/8/2010 H          8 1/3/2011