Julia DataFrames:Split-Apply-Combine策略的问题

时间:2014-05-22 12:26:01

标签: julia

我有一些数据(来自R课程作业,但这并不重要)我想使用拆分 - 应用 - 合并策略,但我遇到了一些问题。数据位于DataFrame上,称为结果,每行代表一个医院。每列都有关于该医院的信息,如姓名,地点,费率等。

我的目标是通过心脏病发作率获得最低"死亡率的医院"每个州。

我正在玩一些策略,并使用by函数遇到问题:

best_heart_rate(df) = sort(df, cols = :Mortality)[end,:]
best_hospitals = by(hospitals, :State, best_heart_rate)

我们的想法是按状态拆分hospitals DataFrame,按死亡率对每个SubDataFrame进行排序,获取最低的一个,然后将这些行合并到一个新的DataFrame中

但是当我使用这个策略时,我得到了:

ERROR: no method nrow(SubDataFrame{Array{Int64,1}})
 in sort at /home/paulo/.julia/v0.3/DataFrames/src/dataframe/sort.jl:311
 in sort at /home/paulo/.julia/v0.3/DataFrames/src/dataframe/sort.jl:296
 in f at none:1
 in based_on at /home/paulo/.julia/v0.3/DataFrames/src/groupeddataframe/grouping.jl:144
 in by at /home/paulo/.julia/v0.3/DataFrames/src/groupeddataframe/grouping.jl:202

我认为没有为SubDataFrames实现nrow函数,所以我收到了一个错误。所以我使用了一个更糟糕的代码:

best_heart_rate(df) = (df[sortperm(df[:,:Mortality] , rev=true), :])[1,:]
best_hospitals = by(hospitals, :State, best_heart_rate)

似乎工作。但现在存在NA问题:如何从NA列上Mortality的SubDataFrame中删除行?是否有更好的策略来实现我的目标?

1 个答案:

答案 0 :(得分:3)

如果我理解正确的话,我认为这可能有用:

# Let me make up some data about hospitals in states
hospitals = DataFrame(State=sample(["CA", "MA", "PA"], 10), mortality=rand(10), hospital=split("abcdefghij", ""))
hospitals[3, :mortality] = NA

# You can use the indmax function to find the index of the maximum element
by(hospitals[complete_cases(hospitals), :], :State, df -> df[indmax(df[:mortality]), [:mortality, :hospital]])



    State   mortality             hospital
1   CA      0.9469632421111882    j
2   MA      0.7137144590022733    f
3   PA      0.8811901895164764    e