adicionar uma linha a um quadro de dados em formato longo

user3206440

Dado um dataframe dfcomo abaixo

text <- "
parameter,car,qtr,val
a,a3,FY18Q1,23
b,a3,FY18Q1,10000
a,a3,FY18Q2,14
b,a3,FY18Q2,12000
a,cla,FY18Q1,15
b,cla,FY18Q1,12000
c,cla,FY18Q1,5.5
a,cla,FY18Q2,26
b,cla,FY18Q2,10000
c,cla,FY18Q2,6.2
"
df <- read.table(textConnection(text), sep = ",", header = TRUE)

Quero adicionar uma linha com parâmetro b_diffpara cada car, qtrcombinação com valcomo diferença de parâmetro bpor duas consecutivas qtr. A qtrordem crescente é FY18Q1, FY18Q2. Para o primeiro qtrque é FY18Q1, o valpara b_diffdeve ser NA, pois não há previous qtr.

A saída esperada é a seguinte.

parameter   car qtr val
a   a3  FY18Q1  23
b   a3  FY18Q1  10000
b_diff  a3  FY18Q1  NA
a   a3  FY18Q2  14
b   a3  FY18Q2  12000
b_diff  a3  FY18Q2  2000
a   cla FY18Q1  15
b   cla FY18Q1  12000
c   cla FY18Q1  5.5
b_diff  cla FY18Q1  NA
a   cla FY18Q2  26
b   cla FY18Q2  10000
c   cla FY18Q2  6.2
b_diff  cla FY18Q2  -2000

Como faço para fazer isso dplyr?

www

Uma solução usando e . Podemos criar um ID de grupo usando group_indicese com base nisso para dividir o quadro de dados, resumir os dados e combiná-los. df5é a saída final.

library(dplyr)
library(purrr)

df2 <- df %>% mutate(GroupID = group_indices(., car, qtr))

df3 <- df2 %>%
  filter(parameter %in% "b") %>%
  group_by(car) %>%
  mutate(val = val - lag(val), parameter = "b_diff") %>%
  ungroup() %>%
  split(f = .$GroupID)

df4 <- df2 %>% split(f = .$GroupID)

df5 <- map2_dfr(df4, df3, bind_rows) %>% select(-GroupID)

df5
#    parameter car    qtr     val
# 1          a  a3 FY18Q1    23.0
# 2          b  a3 FY18Q1 10000.0
# 3     b_diff  a3 FY18Q1      NA
# 4          a  a3 FY18Q2    14.0
# 5          b  a3 FY18Q2 12000.0
# 6     b_diff  a3 FY18Q2  2000.0
# 7          a cla FY18Q1    15.0
# 8          b cla FY18Q1 12000.0
# 9          c cla FY18Q1     5.5
# 10    b_diff cla FY18Q1      NA
# 11         a cla FY18Q2    26.0
# 12         b cla FY18Q2 10000.0
# 13         c cla FY18Q2     6.2
# 14    b_diff cla FY18Q2 -2000.0

DADOS

Observe que é melhor ter stringsAsFactors = FALSE.

text <- "
parameter,car,qtr,val
a,a3,FY18Q1,23
b,a3,FY18Q1,10000
a,a3,FY18Q2,14
b,a3,FY18Q2,12000
a,cla,FY18Q1,15
b,cla,FY18Q1,12000
c,cla,FY18Q1,5.5
a,cla,FY18Q2,26
b,cla,FY18Q2,10000
c,cla,FY18Q2,6.2
"
df <- read.table(textConnection(text), sep = ",", header = TRUE, stringsAsFactors = FALSE)

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como adicionar uma linha a um quadro de dados em R?

Converter uma lista aninhada (3 níveis) em um quadro de dados de formato longo / alto

Como posso resumir um quadro de dados em um formato "longo" em várias colunas?

Como "mesclar" valores de coluna repetidos em um quadro de dados de formato longo

adicionar uma nova linha em um quadro de dados do pandas com base em uma condição

Converte uma linha de um quadro de dados em vetor

Como adicionar um atributo específico como uma nova linha para o respectivo quadro de dados em uma lista

Recolher um quadro de dados em uma linha única

Verifique se existe uma linha em um quadro de dados em outro quadro de dados

Adicionar uma linha a um quadro de dados quando a linha contém mais elementos do que colunas no quadro de dados

Reformate os dados com vários cabeçalhos para um formato longo, com uma linha de cabeçalho tornando-se os dados em uma nova coluna

para cada linha em um quadro de dados, descubra se há uma linha "fechada" em outro quadro de dados

Como adicionar uma linha ao quadro de dados com base em uma condição

Adicionar um padrão a cada linha de maneira alternativa em um quadro de dados

Existe uma maneira de preencher os valores ausentes em um quadro de dados em um formato de lista como o último valor da lista na linha anterior?

Convertendo uma linha de dados em um quadro de dados em R

Convertendo uma linha de dados em um quadro de dados em R

Converta um quadro de dados de formato longo em um formato amplo, mas mantendo o número de colunas em R

Mesclando um amplo quadro de dados com um longo quadro de dados em R

Trace uma linha diferente para cada linha de um quadro de dados em R

Transforme uma data de formato longo em um formato curto

como adicionar linhas a um quadro de dados que estão em outro quadro de dados por uma coluna em pyspark

atribuir o nome da linha enquanto vincula uma linha em um quadro de dados

Como criar um quadro de dados de uma linha a partir de um vetor em R?

Como um quadro de dados pode ser transformado em uma string com formato csv em R?

Como um quadro de dados pode ser transformado em uma string com formato csv em R?

criar uma variável e adicionar a um quadro de dados dentro de um loop em R

Forma elegante de adicionar colunas em uma posição específica em um quadro de dados

Como reorganizar colunas de um quadro de dados com base em valores em uma linha