Dataframe R';Julia中的s表函数(用于数据帧)

Dataframe R';Julia中的s表函数(用于数据帧),dataframe,julia,Dataframe,Julia,Julia中有类似R的表函数吗?我读过关于xtab,但不知道如何使用它 假设我们有R的data.frameby(jldata,:性别,nrow) 3x2数据帧。数据帧 |第|行性别| x1| |-----|----------|-------| |1 | NA | 175| |2 |“女性”40254| |3 |“男性”58574| 当然,它不是一个表,但至少我得到了与数据源相同的数据类型。令人惊讶的是,by似乎比countmap快,我相信,从1.5.3开始,Julia中的“by”就贬值了(它

Julia中有类似R的表函数吗?我读过关于
xtab
,但不知道如何使用它

假设我们有R的
data.frame
,它
col6
因子类型

R示例代码:


rdata您可以使用
StatsBase.jl
中的
countmap
函数对单个变量的条目进行计数。目前缺乏列联表的一般交叉制表和统计检验。正如Ismael所指出的,这一点已在
StatsBase.jl

的问题跟踪器中讨论过。我得出结论,使用
by
可以实现类似的效果:

jldata
包含
:gender

julia>by(jldata,:性别,nrow)
3x2数据帧。数据帧
|第|行性别| x1|
|-----|----------|-------|
|1 | NA | 175|
|2 |“女性”40254|
|3 |“男性”58574|

当然,它不是一个
,但至少我得到了与数据源相同的数据类型。令人惊讶的是,
by
似乎比
countmap

快,我相信,从1.5.3开始,Julia中的“by”就贬值了(它说:ERROR:ArgumentError:by函数已从DataFrames.jl中删除)

所以这里有一些替代方案,我们可以使用split-apply-combine来做交叉标签,也可以使用FreqTables

使用分离式联合收割机:

#    3×2 DataFrame
#     Row │ Cyl    nrow
#         │ Int64  Int64
#    ─────┼──────────────
#       1 │     6      7
#       2 │     4     11
#       3 │     8     14
## count cross tabs
#3×2 Named Array{Int64,2}
#Dim1 ╲ Dim2 │  0   1
#────────────┼───────
#4           │  3   8
#6           │  4   3
#8           │ 12   2

## proportion wise (overall)
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │       0        1
#────────────┼─────────────────
#4           │ 0.09375     0.25
#6           │   0.125  0.09375
#8           │   0.375   0.0625


## Column wise proportion
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │        0         1
#────────────┼───────────────────
#4           │ 0.157895  0.615385
#6           │ 0.210526  0.230769
#8           │ 0.631579  0.153846

## Row wise proportion
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │        0         1
#────────────┼───────────────────
#4           │ 0.272727  0.727273
#6           │ 0.571429  0.428571
#8           │ 0.857143  0.142857
示例1-单列

using RDatasets
using DataFrames

mtcars = dataset("datasets", "mtcars")

## To do a table on cyl column

gdf = groupby(mtcars, :Cyl)
combine(gdf, nrow)
## we have to just change the groupby code a little bit and rest is same

gdf = groupby(mtcars, [:Cyl, :AM])
combine(gdf, nrow) 
#6×3 DataFrame
# Row │ Cyl    AM     nrow
#     │ Int64  Int64  Int64
#─────┼─────────────────────
#   1 │     6      1      3
#   2 │     4      1      8
#   3 │     6      0      4
#   4 │     8      0     12
#   5 │     4      0      3
#   6 │     8      1      2
输出:

#    3×2 DataFrame
#     Row │ Cyl    nrow
#         │ Int64  Int64
#    ─────┼──────────────
#       1 │     6      7
#       2 │     4     11
#       3 │     8     14
## count cross tabs
#3×2 Named Array{Int64,2}
#Dim1 ╲ Dim2 │  0   1
#────────────┼───────
#4           │  3   8
#6           │  4   3
#8           │ 12   2

## proportion wise (overall)
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │       0        1
#────────────┼─────────────────
#4           │ 0.09375     0.25
#6           │   0.125  0.09375
#8           │   0.375   0.0625


## Column wise proportion
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │        0         1
#────────────┼───────────────────
#4           │ 0.157895  0.615385
#6           │ 0.210526  0.230769
#8           │ 0.631579  0.153846

## Row wise proportion
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │        0         1
#────────────┼───────────────────
#4           │ 0.272727  0.727273
#6           │ 0.571429  0.428571
#8           │ 0.857143  0.142857
示例2-两列之间的交叉表

using RDatasets
using DataFrames

mtcars = dataset("datasets", "mtcars")

## To do a table on cyl column

gdf = groupby(mtcars, :Cyl)
combine(gdf, nrow)
## we have to just change the groupby code a little bit and rest is same

gdf = groupby(mtcars, [:Cyl, :AM])
combine(gdf, nrow) 
#6×3 DataFrame
# Row │ Cyl    AM     nrow
#     │ Int64  Int64  Int64
#─────┼─────────────────────
#   1 │     6      1      3
#   2 │     4      1      8
#   3 │     6      0      4
#   4 │     8      0     12
#   5 │     4      0      3
#   6 │     8      1      2
输出

using RDatasets
using DataFrames

mtcars = dataset("datasets", "mtcars")

## To do a table on cyl column

gdf = groupby(mtcars, :Cyl)
combine(gdf, nrow)
## we have to just change the groupby code a little bit and rest is same

gdf = groupby(mtcars, [:Cyl, :AM])
combine(gdf, nrow) 
#6×3 DataFrame
# Row │ Cyl    AM     nrow
#     │ Int64  Int64  Int64
#─────┼─────────────────────
#   1 │     6      1      3
#   2 │     4      1      8
#   3 │     6      0      4
#   4 │     8      0     12
#   5 │     4      0      3
#   6 │     8      1      2
另请注意,如果您不喜欢顶部的名称为nrow,您可以使用:
联合收割机(gdf,nrow=>:计数)
将名称更改为Count

替代方法:使用频率表

您可以使用下面的软件包,
FreqTables
轻松地进行计数和比例计算,要添加它,您可以使用
Pkg.add(“FreqTables”)

输出:

#    3×2 DataFrame
#     Row │ Cyl    nrow
#         │ Int64  Int64
#    ─────┼──────────────
#       1 │     6      7
#       2 │     4     11
#       3 │     8     14
## count cross tabs
#3×2 Named Array{Int64,2}
#Dim1 ╲ Dim2 │  0   1
#────────────┼───────
#4           │  3   8
#6           │  4   3
#8           │ 12   2

## proportion wise (overall)
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │       0        1
#────────────┼─────────────────
#4           │ 0.09375     0.25
#6           │   0.125  0.09375
#8           │   0.375   0.0625


## Column wise proportion
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │        0         1
#────────────┼───────────────────
#4           │ 0.157895  0.615385
#6           │ 0.210526  0.230769
#8           │ 0.631579  0.153846

## Row wise proportion
#3×2 Named Array{Float64,2}
#Dim1 ╲ Dim2 │        0         1
#────────────┼───────────────────
#4           │ 0.272727  0.727273
#6           │ 0.571429  0.428571
#8           │ 0.857143  0.142857

请看正在进行的讨论:这真是太好了。对于数据帧,我更喜欢这种方法,而不是
countmap
。可能值得补充的是,这种方法可以用于进行多个交叉制表,而
countmap
目前无法做到这一点。