我是使用R的新手,并且正在做一些练习。特别是,我想知道是否有任何方法可以计算X的绝对频率,但不使用函数table(x)
换句话说,我想获得“ table(X)”给出的相同输出,但是不使用此函数。有可能吗?
如果出于某种原因必须避免使用最直接的方法,即使用table
函数,则有多种计算频率的方法(例如,参见注释)。一种替代方法是通过定义for
循环:
样本数据:
set.seed(123)
dt <- sample(LETTERS[1:5], 100, replace = T)
要计算频率,您首先需要设置一个空矢量来填充for
循环的结果:
f <- c()
然后运行for
循环本身,即循环遍历dt
中的唯一元素,然后sum
将它们逐个索引:
for(i in unique(dt)){
f[i] <- sum(dt== i)
}
通过这种方式获得此频率列表:
f
B D C E A
20 22 21 18 19
创建没有base::table()
的频率表的一种方法是使用tables::tabular()
。这是一个示例,其中我们为mtcars
数据帧中的几个离散变量创建表。这种方法的好处是它除了提供频率外还提供了百分比。
library(tables)
tabular((Factor(am) + Factor(carb))~(n=1 + Percent("col")),data = mtcars)
...和输出:
n
All Percent
am 0 19 59.375
1 13 40.625
carb 1 7 21.875
2 10 31.250
3 3 9.375
4 10 31.250
6 1 3.125
8 1 3.125
>
另一种方法是使用dyplr
和tidyr
。我们将mtcars
数据转换为窄格式,并计算三个分类变量的频率:cyl
,carb
和am
。
library(dplyr)
library(tidyr)
mtcars %>% mutate(model = rownames(.)) %>%
group_by(model) %>% select(model,cyl,carb,am) %>%
pivot_longer(.,-model,names_to = "variable",values_to = "value") %>%
mutate(count = 1) %>% group_by(variable,value) %>%
summarise(freq = sum(count))
...和输出:
variable value freq
<chr> <dbl> <dbl>
1 am 0 19
2 am 1 13
3 carb 1 7
4 carb 2 10
5 carb 3 3
6 carb 4 10
7 carb 6 1
8 carb 8 1
9 cyl 4 11
10 cyl 6 7
11 cyl 8 14