r - 根据所选变量计算一个类别的频率

r - calculate frequency of one category based on selected variable

我有一个名为 stats 的数据框,其中包含两列 GenderTransportation.used如下图:

Gender    Transportation.used
Male      Bus
Male      Car
Female    Car
Male      Car
Male      Motorcycle
Female    Bus

列表还在继续……(或在此处查看:http://i.stack.imgur.com/GROIi.jpg

data_stats <- read.table(text="Gender   Transportation.used
Male    Bus
Male    Car
Female  Car
Male    Car
Male    Motorcycle
Female  Bus
Female  Bus
Female  Bus
Female  Bus
Male    Car
Female  Car
",header=T)

我想做的是根据选择的交通工具计算性别频率。稍后我将需要这些数据来绘制百分比条形图。期望的输出如下:

          Male    Female
   Bus    1        4

那么如何计算才能得到数据呢?我仍然是使用 R 的初学者,请帮助我。提前致谢!

尝试,对于频率,

table(stats)

或者,对于相对频率,

prop.table(table(stats))

或者,甚至更好(例如),

 xtabs(male ~ car, data = stats)

我添加几个例子:

dt  <- data.frame(gender = rep(c("Male", "Female"), c(4, 2) ), trans = rep(c("Car", "Bus", "Bike"), c(3, 2, 1) ))

table(dt)
        trans
gender   Bike Bus Car
Female    1   1   0
Male      0   1   3

无论如何,根据我从你的问题中得到的数据,我们正在处理因素。如果您想要更多的表格选项,您应该进行少量 class 转换。

编辑:

这里是您在评论中发布的问题的答案。通过调整dt$colname的参数,您可以更好地控制最终输出。

table(dt$gender[dt$trans=="Car"])

Female   Male 
     0      3 

您可以使用 table.

我们重新创建了您的 data.frame。请注意,最好提供 reproducible example

df <- read.table(text="
Gender    Transportation.used
Male      Bus
Male      Car
Female    Car
Male      Car
Male      Motorcycle
Female    Bus", header=T)

那么你可以使用table:

table(df$Transportation.used, df$Gender) # here we type `df` twice
with(df, table(Transportation.used, Gender)) # `with` avoids that

在这种只有两列的特殊情况下,table(df) 也可以工作并产生所需的输出(尽管已转置)。

如果您确实希望 Male 作为 table 的第一列,您可以更改因数 Gender 的级别顺序(默认按字母顺序排列)

levels(df$Gender) # Female comes (alphabetically) before Male
df$Gender <- factor(df$Gender, levels=rev(levels(df$Gender))) # we rearrange Gender levels order

现在 with(df, table(Transportation.used, Gender)) 正是您想要的输出。

Gender
Transportation.used Male Female
Bus           1      1
Car           2      1
Motorcycle    1      0

您可以从中得到的最基本的图表(但请参阅 ?barplot)是:

tab <- with(df, table(Transportation.used, Gender))
barplot(tab)

(编辑)

那么,如果你想要table单传输模式,你可以:

with(df, table(Transportation.used, Gender))["Bus",, drop=FALSE ]
                    Gender
Transportation.used Female Male
                Bus      1    1