Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7823535
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 2, 20262026-06-02T08:17:02+00:00 2026-06-02T08:17:02+00:00

df1 <- data.frame(c("male", "female", "male"), c("1", "2", "3", "4", "5", "6"), seq(141, 170)) names(df1)

  • 0
df1 <-
  data.frame(c("male", "female", "male"),
             c("1", "2", "3", "4", "5", "6"),
             seq(141, 170))

names(df1) = c("gender", "age", "height")

df1$age <- factor(
  df1$age,
  levels = c(1, 2, 3, 4, 5, 6),
  labels = c("16-24", "25-34", "35-44", "45-54", "55-64", "65+")
)

q1a = c(1, 0, 1, 0, 0, 1)
q1b = c(0, 0, 2, 2, 2, 0)
q1c = c(0, 0, 3, 3, 0, 3)
# 1,2 and 3 used to be compatible with existing datasets. 
# Could change all to 1 if necessary.

df2 <- data.frame(q1a = q1a, q1b = q1b, q1c = q1c)
df1 <- cbind(df1, df2)

rm(q1a, q1b, q1c, df2)

I am looking to replicate the analysis of multiple response questions from SPSS in R.

At the moment I am using this code:

#creating function for analysing questions with grouped data
multfreqtable <- function(a, b, c) {
  # number of respondents (for percent of cases)
  totrep = sum(a == 1 | b == 2 | c == 3)
  
  #creating frequency table
  table_a = data.frame("a", sum(a == 1))
  names(table_a) = c("question", "freq")
  table_b = data.frame("b", sum(b == 2))
  names(table_b) = c("question", "freq")
  table_c = data.frame("c", sum(c == 3))
  names(table_c) = c("question", "freq")
  table_question <- rbind(table_a, table_b, table_c)
  
  #remove individual question tables
  rm(table_a, table_b, table_c)
  
  #adding total
  total = as.data.frame("Total")
  totalsum = (sum(table_question$freq, na.rm = TRUE))
  totalrow = cbind(total, totalsum)
  names(totalrow) = c("question", "freq")
  table_question = rbind(table_question, totalrow)
  
  #adding percentage column to frequency table
  percentcalc = as.numeric(table_question$freq)
  percent = (percentcalc / totalsum) * 100
  table_question <- cbind(table_question, percent)
  
  #adding percent of cases column to frequency table
  poccalc = as.numeric(table_question$freq)
  percentofcases = (poccalc / totrep) * 100
  table_question <- cbind(table_question, percentofcases)
  
  #print percent of cases value
  total_respondents <<- data.frame(totrep)
  
  #remove all unnecessary data and values
  rm(
    total,
    totalsum,
    totalrow,
    b,
    c,
    percent,
    percentcalc,
    percentofcases,
    totrep,
    poccalc
  )
  
  return(table_question)
}

#calling function - must tie to data.frame using $ !!!
q1_frequency <- multfreqtable(df1$q1a, df1$q1b, df1$q1c)

#renaming percent of cases - This is very important while using current method
total_respondents_q1 <- total_respondents
rm(total_respondents)

Producing this table as a result:

Output table

I am looking for a more efficient method of doing this that ideally would not require the function to be edited if there were more or less multiple choice questions.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-02T08:17:03+00:00Added an answer on June 2, 2026 at 8:17 am

    Your function is actually far too complicated for what you need to do. I think a function like this should work and be more flexible.

    multfreqtable = function(data, question.prefix) {
      # Find the columns with the questions
      a = grep(question.prefix, names(data))
      # Find the total number of responses
      b = sum(data[, a] != 0)
      # Find the totals for each question
      d = colSums(data[, a] != 0)
      # Find the number of respondents
      e = sum(rowSums(data[,a]) !=0)
      # d + b as a vector. This is your overfall frequency 
      f = as.numeric(c(d, b))
      data.frame(question = c(names(d), "Total"),
                 freq = f,
                 percent = (f/b)*100,
                 percentofcases = (f/e)*100 )
    }
    

    Add another question to your example dataset:

    set.seed(1); df1$q2a = sample(c(0, 1), 30, replace=T)
    set.seed(2); df1$q2b = sample(c(0, 2), 30, replace=T)
    set.seed(3); df1$q2c = sample(c(0, 3), 30, replace=T)
    

    Make a table for “q1” responses:

    > multfreqtable(df1, "q1")
      question freq   percent percentofcases
    1      q1a   15  33.33333             60
    2      q1b   15  33.33333             60
    3      q1c   15  33.33333             60
    4    Total   45 100.00000            180
    

    Make a table for “q2” responses:

    > multfreqtable(df1, "q2")
      question freq   percent percentofcases
    1      q2a   14  31.11111       53.84615
    2      q2b   13  28.88889       50.00000
    3      q2c   18  40.00000       69.23077
    4    Total   45 100.00000      173.07692
    

    Tables for multiple questions

    Here’s a modified version of the function that allows you to create a list of tables for multiple questions at once:

    multfreqtable = function(data, question.prefix) {
      z = length(question.prefix)
      temp = vector("list", z)
    
      for (i in 1:z) {
        a = grep(question.prefix[i], names(data))
        b = sum(data[, a] != 0)
        d = colSums(data[, a] != 0)
        e = sum(rowSums(data[,a]) !=0)
        f = as.numeric(c(d, b))
        temp[[i]] = data.frame(question = c(sub(question.prefix[i], 
                                                "", names(d)), "Total"),
                               freq = f,
                               percent = (f/b)*100,
                               percentofcases = (f/e)*100 )
        names(temp)[i] = question.prefix[i]
      }
      temp
    }
    

    Examples:

    > multfreqtable(df1, "q1")
    $q1
      question freq   percent percentofcases
    1        a   15  33.33333             60
    2        b   15  33.33333             60
    3        c   15  33.33333             60
    4    Total   45 100.00000            180
    
    > test1 = multfreqtable(df1, c("q1", "q2"))
    > test1
    $q1
      question freq   percent percentofcases
    1        a   15  33.33333             60
    2        b   15  33.33333             60
    3        c   15  33.33333             60
    4    Total   45 100.00000            180
    
    $q2
      question freq   percent percentofcases
    1        a   14  31.11111       53.84615
    2        b   13  28.88889       50.00000
    3        c   18  40.00000       69.23077
    4    Total   45 100.00000      173.07692
    
    > test1$q1
      question freq   percent percentofcases
    1        a   15  33.33333             60
    2        b   15  33.33333             60
    3        c   15  33.33333             60
    4    Total   45 100.00000            180
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have many data.frames, for example: df1 = data.frame(names=c('a','b','c','c','d'),data1=c(1,2,3,4,5)) df2 = data.frame(names=c('a','e','e','c','c','d'),data2=c(1,2,3,4,5,6)) df3 =
Define: > dats <- list( df1 = data.frame(a=sample(1:3), b = as.factor(rep(325.049072M,3))), + df2 =
I've got the following three dataframes: df1 <- data.frame(name=c(John, Anne, Christine, Andy), age=c(31, 26,
I am working with data.frames that have very similar names (df1, df2,.. df7). Because
Given two data frames: df1 = data.frame(CustomerId = c(1:6), Product = c(rep(Toaster, 3), rep(Radio,
Define: df1 <-data.frame( id=c(rep(1,3),rep(2,3)), v1=as.character(c(a,b,b,rep(c,3))) ) s.t. > df1 id v1 1 1 a
I have the following list1 and list2 : df1 <- data.frame(x=(1:3),Q=(3:5)) df2 <- data.frame(x=(1:3),Q=(3:5))
Given the dataframes df1 <- data.frame(CustomerId=c(1:6),Product=c(rep(Toaster,3),rep(Radio,3))) df2 <- data.frame(CustomerId=c(2,4,6),State=c(rep(Alabama,2),rep(Ohio,1))) are stored in a list
have the following data frames: id1<-c(1,2,3,4,5) spent<-c(10,20,30,40,50) id2<-c(1,3,4) x<-c(1,2,2) df1<-data.frame(id1,spent) df2<-data.frame(id2,x) I need to
Let say I have the following data frame in R: df1 <- data.frame(Item_Name =

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.