我对R语言还很陌生,可能这是一个非常基础的问题,但假设我有一个包含男生和女生的学生数据集,其中有两列。一列是学生,另一列是性别。如何计算每个性别所占的百分比?
我对R语言还很陌生,可能这是一个非常基础的问题,但假设我有一个包含男生和女生的学生数据集,其中有两列。一列是学生,另一列是性别。如何计算每个性别所占的百分比?
使用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。
proportions <- table(your_data_frame$gender_columnn)/length(your_data_frame$gender_column)
percentages <- proportions*100
这个问题已经有一些很好的答案了,但是由于原始提交者承认自己对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
这可能不是最有效的解决方法,但这是解决问题的一种方式。
首先,您必须创建一个数据框。以下是一种人工创建的方法:
students <- data.frame(student = c("Carla", "Josh", "Amanda","Gabriel", "Shannon", "Tiffany"), gender = c("Female", "Male", "Female", "Male", "Female", "Female")
View(students)
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)
现在它不会堆叠了。
prop.table
有一个参数margin=
,用于计算组内比例。例如:prop.table(table(students), 2)
。此外,您在回答中使用了“引号”,而不是代码块 - 您想要的按钮看起来像“{}`” - 或者只需在每行代码前面放置4个空格即可。 - thelatemail
table
和prop.table
函数。 - Sixiang.Hu