簡體   English   中英

在R中按組將上一行添加到相應列

[英]Add Previous Row to Corresponding Column by Group in R

我將發布一個可復制的示例。

id <- c(1,1,1,1,2,2,1,1)
group <- c("a","b","c","d","a","b","c","d")
df <- data.frame(id, group)

我想要這樣的最終結果。

+====+========+========+
| id | group1 | group2 |
+====+========+========+
|  1 | a      | b      |
+----+--------+--------+
|  1 | b      | c      |
+----+--------+--------+
|  1 | c      | d      |
+----+--------+--------+
|  1 | d      | -      |
+----+--------+--------+
|  2 | a      | b      |
+----+--------+--------+
|  2 | b      | -      |
+----+--------+--------+
|  1 | c      | d      |
+----+--------+--------+
|  1 | d      | -      |
+----+--------+--------+

僅提及ID的順序。 我還有另一列作為時間戳。

data.table使用dplyrrleid一種解決方案:

library(dplyr)

df %>% 
  mutate(id2 = data.table::rleid(id)) %>% 
  group_by(id2) %>% 
  mutate(group2 = lead(group))

# A tibble: 8 x 4
# Groups:   id2 [3]
     id group   id2 group2
  <dbl> <fct> <int> <fct> 
1  1.00 a         1 b     
2  1.00 b         1 c     
3  1.00 c         1 d     
4  1.00 d         1 NA    
5  2.00 a         2 b     
6  2.00 b         2 NA    
7  1.00 c         3 d     
8  1.00 d         3 NA    

如果我理解正確的問題,可以使用以下功能:

id <- c(1,1,1,1,2,2,1,1)
group <- c("a","b","c","d","a","b","c","d")
df <- data.frame(id, group)

add_group2 <- function(df) {
  n <-length(group)
  group2 <- as.character(df$group[2:n])
  group2 <- c(group2, "-")
  group2[which(c(df$id[-n] - c(df$id[2:n]), 0) != 0)] <- "-"
  return(data.frame(df, group2))
}
add_group2(df)

結果應為:

 id group group2
1  1     a      b
2  1     b      c
3  1     c      d
4  1     d      -
5  2     a      b
6  2     b      -
7  1     c      d
8  1     d      -

暫無
暫無

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

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