簡體   English   中英

R-特定組內數據幀中行的特定合並

[英]R- Specific merging of rows in a dataframe within unique groups

我在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的列。

有任何想法嗎? 謝謝。

根據預期的輸出,我們可以split 'ITEM',用行lagcbind行,然后將data.frame list轉換為單個data.framerbind

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 

數據

df <- structure(list(ITEM = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 
4L), ID = c("A", "B", "C", "D", "E", "F", "G", "A", "B", "C", 
"H"), Score = c(7L, 8L, 7L, 3L, 5L, 4L, 6L, 9L, 10L, 5L, 8L), 
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", "1/3/2011")), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM