es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La mejor manera de realizar operaciones de filas en R utilizando Pivot_wider.

A continuación se muestra un ejemplo de los datos. El objetivo es combinar las filas en una sola por indcode y propiedad. Las áreas 029 y 031 deben combinarse en una nueva fila, 039900. Por el momento, hay cuatro filas por área. Se buscan crear 4 filas más que sean la suma de las dos áreas por indcode. Hice una pregunta muy similar ayer, pero busco una solución que implique una versión más centrada en dplyr. Mi primer intento está al final

library(dplyr)
library(data.table)


areax <- c(029,029,029,029,031,031,031,031)
indcodex <- c(1011,1012,1011,1012,1011,1012,1011,1012)
time1 <- c(100,150,102,152,104,154,108,158)
time2 <- c(101,151,103,153,105,155,109,162)
ownership <- c(50,50,30,30,50,50,30,30)

test2 <- data.frame(areax,indcodex,time1,time2,ownership)

Resultado deseado

   areax        indcodex      time1     time2    ownership
     029           1011         100        101       50
     029           1012         150        151       50
     029           1011         102        103       30
     029           1021         152        153       30
     031           1011         104        105       50
     031           1012         154        155       50
     031           1011         108        109       30
     031           1021         158        162       30
     039900        1011         204        206       50
     039900        1012         304        306       50
     039900        1011         210        212       30
     039900        1012         310        315       30


   test3 <- test2 %>%
   tidyr::pivot_wider(names_from = areax, values_from = time1:time2)

   test3$newarea <- (time1_29 + time1_31)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para combinar filas por indcode y ownership, mientras se suman las columnas time1 y time2, puedes usar la siguiente solución centrada en dplyr:

    “`{r}
    library(dplyr)

    test3 <- test2 %>%
    group_by(indcodex, ownership) %>%
    summarise(time1 = sum(time1),
    time2 = sum(time2)) %>%
    ungroup() %>%
    mutate(areax = ifelse(areax %in% c(“029”, “031”), “039900”, as.character(areax))) %>%
    arrange(areax, indcodex)
    “`

    Este código primero agrupa los datos por indcodex y ownership, y luego calcula la suma de time1 y time2 para cada grupo utilizando summarise(). Los datos resultantes se desagrupan y luego se actualiza la columna areax para especificar que “029” y “031” deben combinarse en un nuevo valor “039900” usando ifelse(). Por último, los datos se ordenan por areax e indcodex.

    Ten en cuenta que este código asume que areax es de tipo caracter, por lo que lo convierte a caracter dentro del statement ifelse(). Si ya es de tipo caracter, puedes eliminar la llamada a as.character(). Además, asegúrate de incluir library(dplyr) antes de ejecutar este código.

Comments are closed.