ChinookJargon
ChinookJargon

Reputation: 99

How to summarize data and create new column?

I am having troubling summarizing my data the way I want it. I was wondering if someone could point out where I was going wrong. Below is a subset of my data. It came from the General Social Survey and the dimensions of my data set were 2x33500

              class  owngun
32997  Middle Class      No
8246  Working Class      No
13613  Middle Class     Yes
31553  Middle Class      No
31316 Working Class      No
20083  Middle Class     Yes
26289  Middle Class      No
29363  Middle Class      No
25821 Working Class Refused
4996   Middle Class     Yes
14641  Middle Class     Yes
15523  Middle Class     Yes
27361 Working Class     Yes
29035 Working Class     Yes
25330  Middle Class      No
16424   Lower Class     Yes
17535 Working Class      No
2841  Working Class      No
18465  Middle Class      No
16629  Middle Class     Yes 

When I generate a table for my dataset:

               owngun
class            Yes   No Refused
  Lower Class    480 1254      21
  Working Class 6519 8752     142
  Middle Class  6216 8915     124
  Upper Class    391  678       7
  No Class         0    1       0

I like these values, but what I'm really interested in is the proportions of yes for each social class. How do I generate a new column of the proportions of yes for each social class?

I have been trying to use dplyr to do this. Can anyone suggest a way to proceed?

Thank you

Upvotes: 0

Views: 1688

Answers (3)

jalind
jalind

Reputation: 491

This solution doesn't use dplyr but how about:

tab <- table(df)
prop.table(tab, margin = 1)

Upvotes: 0

Matt
Matt

Reputation: 178

You can create a new column using dplyr's mutate function. I am assuming the name of the dataframe you generated is called owngun. Therefore:

owngun = mutate(owngun, Yes_percent = Yes/(Yes + No + Refused))

Upvotes: 1

G5W
G5W

Reputation: 37641

Using the bit of data that you provided:

table(df$class, df$owngun)/as.vector(table(df$class))

                       No   Refused       Yes
  Lower Class   0.0000000 0.0000000 1.0000000
  Middle Class  0.5000000 0.0000000 0.5000000
  Working Class 0.5714286 0.1428571 0.2857143

Data

### Your data
df = read.table(text="class  owngun
32997  'Middle Class'      No
8246  'Working Class'      No
13613  'Middle Class'     Yes
31553  'Middle Class'      No
31316 'Working Class'      No
20083  'Middle Class'     Yes
26289  'Middle Class'      No
29363  'Middle Class'      No
25821 'Working Class' Refused
4996  'Middle Class'     Yes
14641  'Middle Class'     Yes
15523  'Middle Class'     Yes
27361 'Working Class'     Yes
29035 'Working Class'     Yes
25330 'Middle Class'      No
16424  'Lower Class'     Yes
17535 'Working Class'      No
2841  'Working Class'      No
18465  'Middle Class'      No
16629  'Middle Class'     Yes",
header=TRUE)

Upvotes: 1

Related Questions