Tengo una gran base de datos de los siguientes datos de muestra. Estoy tratando de crear una función que pueda filtrar el departamento de la columna del departamento uno por uno y los datos del subconjunto filtrado crear una tabla para todos los administradores filtrados como se muestra a continuación.

Los gerentes pueden ser muchos o menos por departamento, de modo que pueda crear una tabla dinámicamente para gerentes filtrados. porque a veces los gerentes pueden ser 1-23 o más para el departamento.

Intenté con la ayuda filtrar y transponer datos y luego vincularlos, pero eso no funciona correctamente para mí, ya que solo tengo un dominio medio en dplyr.

df <- data.frame(Dept = c("CA","HR","CA","HR","HR","CA","HR","HR","CA","CA","HR","CA","CA"),
                 Manager = c("AKASH","MANU","AMAN","SANU","NISH","KAMAL","VEER","SANIL","SAMEER","KANU","NUKUL","KUNAL","RAMIT"),
                 PF = c("Yes","No","Yes","Yes","Yes","No","No","Yes","No","Yes","Yes","Yes","No"),
                 Yearlybonus=c(6946,5871,0,7173,2161,3008,0,3025,4323,4196,0,5594,2313),
                 Quaterlybonus=c(2683,3846,0,2391,6716,6012,5479,3869,3764,0,4632,0,2371),
                 monthlybonus=c(4453,6466,2811,6845,4377,2617,0,7631,7761,2944,6270,3534,5856))

0
user14176250 3 mar. 2021 a las 22:20

2 respuestas

La mejor respuesta

Usando data.table para un gran conjunto de datos

Esta solución no acumula datos transformados como lista. En cambio, usa una función para filtrar datos

library('data.table')
setDT(df)
df[, `:=`(Yearlybonus = as.character(Yearlybonus),
         Quaterlybonus = as.character(Quaterlybonus), 
         monthlybonus = as.character(monthlybonus))]

Esta función es una función pura, porque envía una copia de los datos (df) para funcionar cada vez. Si tiene menos espacio de memoria, puede refactorizar esta función para usar los datos (df) del alcance global. El código refactorizado se verá como los de las líneas comentadas.

# myfun <- function(x) {
myfun <- function(df, x) {
  # wide to long
  # y <- melt( df[Dept == x], 
  df <- melt( df[Dept == x], 
             id.vars = c('Manager'), 
             measure.vars = c('PF', 'Yearlybonus', 'Quaterlybonus', 'monthlybonus'), 
             variable.name = 'T' )
  # long to wide
  # y <- dcast(y, T ~ Manager, value.var = 'value')
  df <- dcast(df, T ~ Manager, value.var = 'value')

  # add dept column
  #y[, Dept := x ]
  df[, Dept := x ]

  # set column order in memory
  #nm <- names(y)
  nm <- names(df)
  nm <- c('Dept', nm[nm != 'Dept'])
  #setcolorder(y, nm)
  setcolorder(df, nm)

  #return(y[])
  return(df[])    }
}

# create index for speed
setkey(df, Dept)

# myfun(x = 'CA')   
myfun(df = df, x = 'CA')

#  Dept             T AKASH AMAN KAMAL KANU KUNAL RAMIT SAMEER
#1:   CA            PF   Yes  Yes    No  Yes   Yes    No     No
#2:   CA   Yearlybonus  6946    0  3008 4196  5594  2313   4323
#3:   CA Quaterlybonus  2683    0  6012    0     0  2371   3764
#4:   CA  monthlybonus  4453 2811  2617 2944  3534  5856   7761

# myfun(x = 'HR')   
myfun(df = df, x = 'HR')
#   Dept             T MANU NISH NUKUL SANIL SANU VEER
#1:   HR            PF   No  Yes   Yes   Yes  Yes   No
#2:   HR   Yearlybonus 5871 2161     0  3025 7173    0
#3:   HR Quaterlybonus 3846 6716  4632  3869 2391 5479
#4:   HR  monthlybonus 6466 4377  6270  7631 6845    0
0
Sathish 4 mar. 2021 a las 01:04

¿Qué tal esto:

library(tidyr)
library(dplyr)
library(purrr)
map(unique(df$Dept), ~df %>% filter(Dept == .x) %>% 
  mutate(across(Yearlybonus:monthlybonus, ~as.character(.x))) %>% 
  pivot_longer(PF:monthlybonus, names_to="T", values_to="vals") %>% 
  pivot_wider(names_from="Manager", values_from="vals"))


# [[1]]
# # A tibble: 4 x 9
#   Dept  T             AKASH AMAN  KAMAL SAMEER KANU  KUNAL RAMIT
#   <chr> <chr>         <chr> <chr> <chr> <chr>  <chr> <chr> <chr>
# 1 CA    PF            Yes   Yes   No    No     Yes   Yes   No   
# 2 CA    Yearlybonus   6946  0     3008  4323   4196  5594  2313 
# 3 CA    Quaterlybonus 2683  0     6012  3764   0     0     2371 
# 4 CA    monthlybonus  4453  2811  2617  7761   2944  3534  5856 
# 
# [[2]]
# # A tibble: 4 x 8
#   Dept  T             MANU  SANU  NISH  VEER  SANIL NUKUL
#   <chr> <chr>         <chr> <chr> <chr> <chr> <chr> <chr>
# 1 HR    PF            No    Yes   Yes   No    Yes   Yes  
# 2 HR    Yearlybonus   5871  7173  2161  0     3025  0    
# 3 HR    Quaterlybonus 3846  2391  6716  5479  3869  4632 
# 4 HR    monthlybonus  6466  6845  4377  0     7631  6270 

0
DaveArmstrong 3 mar. 2021 a las 19:36