2016-05-26 49 views
1
library(OptimalCutpoints) 

library(dplyr) 

下面是測試數據:使用具有多個輸出(?非摘要FXN)與功能總結

set.seed(123) 

df<-data.frame(label=rbinom(1000,size=1,prob=0.5),score=rnorm(1000),type=sample(c("A","B","C","D"),1000,replace=TRUE)) 

使用條件GROUP_BY的「類型」,並希望使用optimal.cutpoints總結從庫函數(OptimalCutpoints)

df%>%group_by(type)%>%summarize(Opt_cut=optimal.cutpoints(X = "score", status = "label", tag.healthy = 0, methods = "MaxSpSe",data=df[,1:2])) 

我得到這個: Error: expecting a single value

我能得到這樣的解決方法,提取每一個「類型」,並分別運行optimal.cutpoints:

df_A<-df%>%filter(grepl("A",type)) 
opt.cut.df.A <- optimal.cutpoints(X = "score", status = "label", tag.healthy = 0, methods = "MaxSpSe", data = df_A) 

從opt.cut.df.AI可以提取最佳截止像這樣:

opt.cut.df.A[1]$MaxSpSe$Global$optimal.cutoff$cutoff 

但是,這絕對不是最好的方式。與大量的「類型」 除非我錯過了一些東西,看起來像總結只會使用一個輸出函數。

問題:如何使用optimal.cutpoints或類似的函數進行彙總?

+0

該函數輸出一個嵌套列表,而'summarize'不期待那個。你只想要單一切入點嗎? –

+0

嗨皮埃爾,在這種情況下是的......但我的一般問題是如何總結在dplyr中輸出值大於1的函數組。我認爲下面Psidom的應用拆分解決方案效果很好!在這種情況下,dplyr可能不是最好的方法。 – thisisrg

+1

我用'data.table'的速度非常快。我嘗試過'dplyr',但找不到方法 –

回答

1
library(data.table) 
setDT(df)[,opt(.SD), by=type] 
    type   V1 
1: A -0.07686590 
2: D 0.10719041 
3: D 0.
4: D 0.13909786 
5: B 0.16122635 
6: B 0.18304797 
7: C -0.08671413 

其中opt是削減的功能:

opt <- function(df) optimal.cutpoints(X = "score", status = "label", tag.healthy = 0, methods = "MaxSpSe", data=df)[1]$MaxSpSe$Global$optimal.cutoff$cutoff 

原因dplyr是行不通的,因爲有時一個組有一個分界點,它也有多次切割。 summarise只等待一個值,混合長度向量造成問題。

+0

謝謝!絕對是......我認爲截止值可能有> 1的值超出了我的想法。 – thisisrg

1

您也可以使用split,apply方法生成模型列表,然後從列表中提取值。

listOfModels <- lapply(split(df, df$type), function(subDf) 
         optimal.cutpoints(X = "score", status = "label", 
             tag.healthy = 0, methods = "MaxSpSe",data=subDf)) 

lapply(listOfModels, function(model) model[1]$MaxSpSe$Global$optimal.cutoff$cutoff) 

$A 
[1] -0.0768659 

$B 
[1] 0.1612264 0.1830480 

$C 
[1] -0.08671413 

$D 
[1] 0.1071904 0.1155321 0.1390979 
2

使用purrr另一種選擇:其中給出

library(purrr) 

df %>% 
    split(.$type) %>% 
    map(~ optimal.cutpoints(X = "score", status = "label", 
          tag.healthy = 0, methods = "MaxSpSe", data = .)) %>% 
    map(c("MaxSpSe", "Global", "optimal.cutoff", "cutoff")) 

#$A 
#[1] -0.0768659 
# 
#$B 
#[1] 0.1612264 0.1830480 
# 
#$C 
#[1] -0.08671413 
# 
#$D 
#[1] 0.1071904 0.1155321 0.1390979 

如果你想在一個data.frame的結果,你可以添加map_df到鏈:

df %>% 
    split(.$type) %>% 
    map(~optimal.cutpoints(X = "score", status = "label", 
          tag.healthy = 0, methods = "MaxSpSe", data = .)) %>% 
    map(c("MaxSpSe", "Global", "optimal.cutoff", "cutoff")) %>% 
    map_df(~data.frame(cutoff = .), .id = "type") 

其中給出:

# type  cutoff 
#1 A -0.07686590 
#2 B 0.16122635 
#3 B 0.18304797 
#4 C -0.08671413 
#5 D 0.10719041 
#6 D 0.
#7 D 0.13909786 
+1

我也在想purrr可能是太用於這個。通過添加map_df(as.data.frame,.id =「type」)'你可以強制使用data.frame,但是我還沒有弄清楚如何命名cutoff值的列。 – aosmith

+0

@aosmith我試圖弄清楚,最終放棄了; P如果你碰巧發現它,請隨時更新我的​​文章。在某些時候,我使用'data.table :: melt()'並設法設置了'value'和'L1' –