creating frequency table for labelled data

Viewed 50

I am trying to create a table for multiple response database but its not showing the all output. its showing only total frequency.

library(expss)
data<-data.frame(
  gender = c(1,2,1,2,1,2,1,2,2,2,2,1,1,2,2,2,2,1,1,1,1,1,2,1,2,1,2,2,2,1,2,1,2,1,2,1,2,2,2),
  sector = c(3,3,1,2,5,4,4,4,4,3,3,4,3,4,2,1,4,2,3,4,4,4,3,1,2,1,5,5,4,3,1,4,5,2,3,4,5,1,4),
  col1=c(1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,1,1,0,0,0,0,1,0,0,0,0,1,0,1),
  col2=c(1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0),
  col3=c(1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,1,0,0,1),
  col4=c(1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  col5=c(1,2,1,1,1,2,1,2,2,1,2,1,1,1,2,2,2,1,1,1,2,1,2,1,1,1,2,2,2,1,1,2,2,1,1,1,2,2,2)
)

data$gender<-factor(data$gender, levels=c(1,2), labels=c("Male","female"))
data$sector<-factor(data$sector, levels=c(1,2,3,4,5), labels=c("TX","CA","NY","LA","WA"))
data$col1<-factor(data$col1, levels=1, labels="Sales")
data$col2<-factor(data$col2, levels=1, labels="OPS")
data$col3<-factor(data$col3, levels=1, labels="Management")
data$col4<-factor(data$col4, levels=1, labels="HR")
data$col5<-factor(data$col5, levels=c(1,2), labels=c("National","Overseas"))

data$gender1 <- ifelse(data$gender == "Male",1,0)
data$total <- ifelse(data$col5 == "National",1,0)


data <- data
var_list <- c("col1","col2","col3")
my_fre <- function(curr_var) setNames(expss::fre(curr_var)[, 1:3],
                                      c("row_labels", "Count N", "Valid percent"))

cross_fun_df(data, list(as.category(col1 %to% col3)),lst, fun = my_fre)

1 Answers

Do you want something like this?

library(tidyverse)

data <- data.frame(
  gender = c(1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2),
  sector = c(3, 3, 1, 2, 5, 4, 4, 4, 4, 3, 3, 4, 3, 4, 2, 1, 4, 2, 3, 4, 4, 4, 3, 1, 2, 1, 5, 5, 4, 3, 1, 4, 5, 2, 3, 4, 5, 1, 4),
  col1 = c(1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1),
  col2 = c(1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0),
  col3 = c(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1),
  col4 = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
  col5 = c(1, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2)
)

data$gender <- factor(data$gender, levels = c(1, 2), labels = c("Male", "female"))
data$sector <- factor(data$sector, levels = c(1, 2, 3, 4, 5), labels = c("TX", "CA", "NY", "LA", "WA"))
data$col1 <- factor(data$col1, levels = 1, labels = "Sales")
data$col2 <- factor(data$col2, levels = 1, labels = "OPS")
data$col3 <- factor(data$col3, levels = 1, labels = "Management")
data$col4 <- factor(data$col4, levels = 1, labels = "HR")
data$col5 <- factor(data$col5, levels = c(1, 2), labels = c("National", "Overseas"))

data$gender1 <- ifelse(data$gender == "Male", 1, 0)
data$total <- ifelse(data$col5 == "National", 1, 0)


data %>%
  mutate(across(everything(), as.character)) %>%
  pivot_longer(everything()) %>%
  count(name, value) %>%
  group_by(name) %>%
  mutate(perc = n / sum(n) * 100)
#> # A tibble: 21 x 4
#> # Groups:   name [9]
#>    name  value          n  perc
#>    <chr> <chr>      <int> <dbl>
#>  1 col1  Sales         12 30.8 
#>  2 col1  <NA>          27 69.2 
#>  3 col2  OPS           25 64.1 
#>  4 col2  <NA>          14 35.9 
#>  5 col3  Management    14 35.9 
#>  6 col3  <NA>          25 64.1 
#>  7 col4  HR             3  7.69
#>  8 col4  <NA>          36 92.3 
#>  9 col5  National      21 53.8 
#> 10 col5  Overseas      18 46.2 
#> # … with 11 more rows

Created on 2022-02-09 by the reprex package (v2.0.1)

Related