编辑(2021-03-29):tidyverse
原则
这里有一些更新的代码,使用了 tidyverse
,具体包括 dplyr
、tibble
和 purrr
函数。代码更易读且更易执行。提供了示例数据集。
tibble(
a = rep(c(1:3), 2),
b = factor(rep(c("Jan", "Feb", "Mar"), 2)),
c = factor(rep(LETTERS[1:3], 2))
) ->
dat
dat
a b c
<int> <fct> <fct>
1 1 Jan A
2 2 Feb B
3 3 Mar C
4 1 Jan A
5 2 Feb B
6 3 Mar C
获取跨列的计数和比例。
library(purrr)
library(dplyr)
library(tibble)
purrr::map(
dat, function(.x) {
count(tibble(x = .x), x) %>%
mutate(pct = (n / sum(n) * 100))
})
purrr::map(dat, ~ count(tibble(x = .x), x) %>%
mutate(pct = (n / sum(n) * 100)))
$a
x n pct
<int> <int> <dbl>
1 1 1 16.7
2 2 1 16.7
3 3 1 16.7
4 4 1 16.7
5 5 1 16.7
6 6 1 16.7
$b
x n pct
<fct> <int> <dbl>
1 Feb 2 33.3
2 Jan 2 33.3
3 Mar 2 33.3
$c
x n pct
<fct> <int> <dbl>
1 A 3 50
2 B 3 50
旧代码...
table()
函数返回一个"表"对象,在我看来,使用R很难操作。我倾向于编写自己的函数来解决这个问题。让我们首先创建一个含有一些分类变量/特征(宽格式数据)的数据框。
我们可以使用lapply()
与基础R中的table()
函数相结合,创建每个特征的频率计数列表。
freqList = lapply(select_if(dat, is.factor),
function(x) {
df = data.frame(table(x))
names(df) = c("x", "y")
return(df)
}
)
该方法允许每个列表对象容易地进行索引并在必要时进一步操作,这对于包含许多特征的数据框架非常方便。使用
print(freqList)
查看所有频率表。
lapply(mydata,table)
是怎么样的呢? - scoalapply(mydata,table)
,并尝试使用write.csv将其保存在csv文件中,但是它产生了一个错误Error in data.frame(s_id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, : arguments imply differing number of rows: 24066, 27558, 17779, 18466, 3, 15, 5, 12, 13, 10, 4, 9, 7, 2, 21, 20, 51, 14, 23, 24, 31, 6, 26, 8, 55, 576, 1027, 2459, 363, 1973, 765
。当我尝试对结果使用data.frame()
时也出现了相同的错误。 - Sankar Narayan Misra