R在Julia中的表函数(对于DataFrames)

时间:2016-01-07 11:53:23

标签: dataframe julia

朱莉娅有没有类似R桌子的功能?我已经阅读了xtab,但不知道如何使用它。

假设我们有data.frame rdata col6属于Factor类型。

R示例代码:

rdata <- read.csv("mycsv.csv") #1 table(rdata$col6) #2

为了在Julia中读取数据和制作因子,我这样做:

using DataFrames jldata = readtable("mycsv.csv", makefactors=true) #1 :col6 will be now pooled.

...,但是如何在julia中构建R表(如何实现#2)?

3 个答案:

答案 0 :(得分:5)

您可以使用countmap中的StatsBase.jl函数来计算单个变量的条目。此时缺乏列联表的一般交叉列表和统计检验。正如Ismael所指出的,StatsBase.jl的问题跟踪器已经讨论过这个问题。

答案 1 :(得分:4)

我得出结论,使用by可以实现类似的效果:

jldata:gender列组成。

julia> by(jldata, :gender, nrow) 3x2 DataFrames.DataFrame | Row | gender | x1 | |-----|----------|-------| | 1 | NA | 175 | | 2 | "female" | 40254 | | 3 | "male" | 58574 |

当然它不是table,但至少我获得的数据类型与数据源相同。令人惊讶的是by似乎比countmap更快。

答案 2 :(得分:0)

我相信,从 1.5.3 开始,“by”在 Julia 中已贬值(它说:ERROR: ArgumentError: by function was removed from DataFrames.jl)。

所以这里有一些替代方案,我们可以使用 split apply combine 来做交叉表或使用 FreqTables。

使用拆分组合:

示例 1 - 单列

using RDatasets
using DataFrames

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

## To do a table on cyl column

gdf = groupby(mtcars, :Cyl)
combine(gdf, nrow)

输出:

#    3×2 DataFrame
#     Row │ Cyl    nrow
#         │ Int64  Int64
#    ─────┼──────────────
#       1 │     6      7
#       2 │     4     11
#       3 │     8     14

示例 2 - 2 列之间的交叉表

## 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 名称,您可以使用: combine(gdf, nrow => :Count) 将名称更改为 Count

替代方法:使用 FreqTables

您可以使用包,FreqTables 如下所示很容易地进行计数和比例,添加它您可以使用 Pkg.add("FreqTables") :

## Cross tab between cyl and am
freqtable(mtcars.Cyl, mtcars.AM)

## Proportion between cyl and am
prop(freqtable(mtcars.Cyl, mtcars.AM))

## with margin like R you can use it too in this (columnwise proportion: margin=2)
 prop(freqtable(mtcars.Cyl, mtcars.AM), margins=2)

## with margin for rowwise proportion: margin = 1
 prop(freqtable(mtcars.Cyl, mtcars.AM), margins=1)

输出:

## 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