如何在R中找到某物的百分比?

4

我对R语言还很陌生,可能这是一个非常基础的问题,但假设我有一个包含男生和女生的学生数据集,其中有两列。一列是学生,另一列是性别。如何计算每个性别所占的百分比?


尝试使用 tableprop.table 函数。 - Sixiang.Hu
4个回答

8

使用data.table的另一种方式:

students <- data.frame( names = c( "Bill", "Stacey", "Fred", "Jane", "Sarah" ), 
                        gender = c( "M", "F", "M", "F", "F" ),
                        stringsAsFactors = FALSE )

library( data.table )
setDT( students )[ , 100 * .N / nrow( students ), by = gender ]

#    gender V1
# 1:      M 40
# 2:      F 60

或者使用 dplyr
library( dplyr )
students %>% 
    group_by( gender ) %>% 
    summarise( percent = 100 * n() / nrow( students ) )

#  A tibble: 2 × 2
#   gender percent
#    <chr>   <dbl>
# 1      F      60
# 2      M      40

这两个包都是用于类似操作的流行工具,但正如已经指出的那样,如果你更喜欢,也可以坚持使用基础R。


3
您可以使用table()函数生成一张表格,告诉您有多少男性和女性学生。然后只需将此表格除以学生的总数(您可以使用length()函数获得此值)。最后,您只需将结果乘以100即可。
您的代码应该像这样:
proportions <- table(your_data_frame$gender_columnn)/length(your_data_frame$gender_column)
percentages <- proportions*100

1

这个问题已经有一些很好的答案了,但是由于原始提交者承认自己对R语言不熟悉,我想提供一个非常详细的答案。下面的答案需要更多的步骤,而且没有使用管道等帮助工具。

希望以这种方式提供答案可以帮助原始提交者理解每一步发生了什么。

# Load the dplyr library
library("dplyr")

# Create an example data frame
students <-
  data.frame(
    names = c("Bill", "Stacey", "Fred", "Jane", "Sarah"),
    gender = c("M", "F", "M", "F", "F"),
    stringsAsFactors = FALSE
  )

# Count the total number of students.
total_students <- nrow(students)

# Use dplyr filter to obtain just Female students
all_female_students <- dplyr::filter(students, gender %in% "F")

# Count total number of female students
total_female <- nrow(all_female_students)

# Repeat to find total number of male students
all_male_students <- dplyr::filter(students, gender %in% "M")

total_male <- nrow(all_male_students)

# Divide total female students by total students 
# and multiply result by 100 to obtain a percentage
percent_female <- (total_female / total_students) * 100

# Repeat for males
percent_male <- (total_male / total_students) * 100

> percent_female
[1] 60
> percent_male
[1] 40

0

这可能不是最有效的解决方法,但这是解决问题的一种方式。

首先,您必须创建一个数据框。以下是一种人工创建的方法:

students <- data.frame(student = c("Carla", "Josh", "Amanda","Gabriel", "Shannon", "Tiffany"), gender = c("Female", "Male", "Female", "Male", "Female", "Female")

View(students) 

然后我使用prop table,它给了我一个比例表或矩阵中列的比率,我将其强制转换为data.frame,因为我喜欢data.frames,并且我必须乘以100来将比率从prop table转换为百分比。
tablature <- as.data.frame.matrix(prop.table(table(students)) * 100)
tablature 

我决定把我的数据框命名为tablature。所以它说"Amanda"在女性列上是16 + (2/3)%。基本上这意味着她是女性,因此男性为0,我的数据框有6个学生,所以(1/6)* 100使她占整个集合的16.667%。

现在女性和男性的百分比各是多少? 两种方法:1)使用apply函数同时获取每个集合的数量,或者一次获取每个集合的数量,现在我们应该使用sum函数。

apply(tablature, 2, FUN = sum)

女性 男性

66.66667 33.33333

想象一下百分比。

其中2个制表符是我正在应用总和函数的比例表数据框,跨列(2表示列或1表示行)。

因此,如果您只是粗略地查看少量数据,则可以看到数据框学生中有2/6 = 33.3333%的男性,以及4/6 = 66.66667%的女性,因此我计算正确。

或者,

sum(tablature$Female)

[1] 66.66667

sum(tablature$Male)

[1] 33.33333

你可以制作一个条形图。按照我格式化的方式,你需要将其作为矩阵来引用以获得条形图。

从这里开始,你可以制作一个堆积视觉比较的性别条形图。

barplot(as.matrix(tablature), xlab = "Gender", main = "Barplot comparison of Gender Among Students", ylab = "Percentages of Student Group")

这是由于 R 把每个学生的箱子设为了 16.6667%。

说实话,如果你只是绘制 apply 函数的输出结果,看起来会更好。当然,你也可以将其保存到变量中。但是,算了吧...

barplot(apply(tablature, 2, FUN = sum), col = c("green", "blue"),xlab = "Gender", ylab = "Percentage of Total Students", main = "Barplot showing the Percentages of Gender Represented Among Students", cex.main = 1)

现在它不会堆叠了。

So Here is a visual representation of what I just calculated


prop.table有一个参数margin=,用于计算组内比例。例如:prop.table(table(students), 2)。此外,您在回答中使用了“引号”,而不是代码块 - 您想要的按钮看起来像“{}`” - 或者只需在每行代码前面放置4个空格即可。 - thelatemail
我不知道那个。通常,我认为如果它能够工作,那么它就不是愚蠢的,但感谢你告诉我有一种方法可以通过少量函数来得到正确的答案。 - xyz123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接