数据争用:按组进行聚合,顺序减少

时间:2019-05-02 13:12:25

标签: r dplyr data.table tidyverse

我是R的新手。我需要按顺序按组汇总数据。我正在添加数据框。前两列提供了数据,我必须对第三列进行突变。

df <- data.frame(id = c(rep("a",3), rep("b",2), rep("c", 4)),
               value = c("x", "z", "p", "q", "q", "m", "n", "x", "y"), 
               reqd = c("x,z,p", "z,p", "p", "q,q","q", "m,n,x,y", "n,x,y", "x,y", "y"))

我已按组进行汇总,但不正确

df_2 <- df[,1:2]  %>% 
group_by(id) %>% 
mutate(reqd2 = paste(value, collapse = ","))

2 个答案:

答案 0 :(得分:2)

我们可以group_by id并在当前row_number和每组中的总行数之间创建一个序列,并将相应的valuetoString串联起来。

library(dplyr)
library(tidyr)

df %>%
  group_by(id) %>%
  mutate(reqd1 = map2_chr(row_number(),n(),~toString(value[.x:.y])))

#  id    value reqd    reqd1     
#  <fct> <fct> <fct>   <chr>     
#1 a     x     x,z,p   x, z, p   
#2 a     z     z,p     z, p      
#3 a     p     p       p         
#4 b     q     q,q     q, q      
#5 b     q     q       q         
#6 c     m     m,n,x,y m, n, x, y
#7 c     n     n,x,y   n, x, y   
#8 c     x     x,y     x, y      
#9 c     y     y       y        

我们还可以仅使用带有ave的基R来做到这一点

with(df, ave(value, id, FUN = function(x) 
        mapply(function(i, j) toString(x[i:j]), seq_along(x), length(x))))

#[1] "x, z, p"  "z, p"  "p"  "q, q"   "q"   "m, n, x, y"  "n, x, y"  "x, y" "y" 

答案 1 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df)[, reqd1 := unlist(Map(function(i, j)
    toString(value[seq(i, j, 1)]), seq_len(.N), .N)),  by = id]
df
#   id value    reqd      reqd1
#1:  a     x   x,z,p    x, z, p
#2:  a     z     z,p       z, p
#3:  a     p       p          p
#4:  b     q     q,q       q, q
#5:  b     q       q          q
#6:  c     m m,n,x,y m, n, x, y
#7:  c     n   n,x,y    n, x, y
#8:  c     x     x,y       x, y
#9:  c     y       y          y