Обработка данных: агрегирование по группам, последовательно сокращая - PullRequest
3 голосов
/ 02 мая 2019

Я новичок в 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 ]

2 голосов
/ 02 мая 2019

Мы можем group_by id и создать последовательность между текущим row_number и общим числом строк в каждой группе и объединить соответствующие value с toString.

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        

Мы также можем сделать это, используя только базу R с ave

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 голос
/ 02 мая 2019

Мы можем сделать это с 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
...