2017-06-18 25 views
0

對於R編程和一般編程,我很無知,但我有兩段代碼遇到了類似的問題(對我來說)。在這裏,我們去...如何在R中的前一個函數的輸出中創建新的函數?

(A)

我現在有一個返回患者,試驗次數,以及其他信息的結果的函數。它看起來像這樣:

 ID trial  start finish  mark  mean number 
903 A34 19  90910 18775077  8236 -0.0197 1.972876 
904 A34 19 18782377 23089165  2343 0.0374 2.052525 
905 A34 19 23093018 43203507 10267 -0.0162 1.977668 
906 A34 19 43203990 43447468  93 0.2138 2.319478 
907 A34 19 43447802 43663369  112 -0.0355 1.951387 
908 A34 19 43663624 43834506  80 -0.5385 1.376973 
909 A34 19 43834848 59097854  8655 -0.0095 1.986873 

以下是我爲它編寫的代碼。

getRS <- function(CNA, samples = NULL, trial = NULL){ race <- racing.summary(subset(CNA, samplelist = samples, triallist = trial)) race$number <- (2^race$mean)*2 return(race) }

我想知道是否有可能使用這個輸出在一個新的功能做簡單的算術。我想從'start'減去'finish'來創建'length',用上面的所有方法創建一個新的'mean',並提取最大的'number'來創建'max.number',同時不顯示'mark'在所有。

類似這樣的輸出:

ID trial  max.length   mean max.number 
A34  19  20110489 -0.05260000  2.3194777 

AND/OR

(B)

我有創建所有患者的已經計算的數據的數據幀的替代功能。我用這個代碼:

getSum <- function(){ 
    race_mean <- as.data.frame(df %>% group_by(ID, trial) %>% summarise(mean = mean(mean))) 
    race_length <- as.data.frame(df %>% group_by(ID,trial) %>% summarise(max.length = max(end - start))) 
    seg_number <- as.data.frame(df %>% group_by(ID,trial) %>% summarise(max.number = max(number))) 
    race_m_l_merge <- as.data.frame(merge(x = race_length, y = race_mean)) 
    race_m_l_n_merge <- as.data.frame(merge(x = race_m_l_merge, y = race_number)) 
    ordered_summary <- as.data.frame(race_m_l_n_merge[order(race_m_l_n_merge$trial),]) 
    View(ordered_summary) 
} 

其中給出一個像這樣的輸出:

 ID trial max.length   mean  max.number 
1 A22  1  96637812 -1.648909e-01  2.6989533 
25 A23  1  101363101 -6.275455e-02  2.2468441 
49 A24  1  72598875 -5.878000e-02  2.8204004 
73 A25  1  112628591 -3.346917e-01  2.0675182 
97 A26  1  55490417 7.621429e-02  2.4512200 
121 A28  1  130879821 -4.218571e-02  2.0679481 
145 A29  1  72590096 -3.093417e-01  2.3450196 
169 A30  1  32642030 4.242500e-02  2.6375528 
193 A32  1  34350731 -8.188372e-02  2.1149155 
217 A33  1  77537981 -1.305833e-01  2.1125713 

有了這個,我想創建一個功能來指定我想查找喜歡哪個ID和審判所以:Function("A22",1)

我希望我的未來R腳本可以在未來的工作中任意使用,所以任何幫助都會對我的問題A,B或者兩者都非常感謝!甚至建議鏈接到有用的網站。 :)

回答

1

如果您已經定義了您的功能getRSgetSum,那麼您可以在一個新功能中調用它們。

Uou只需要更改包含View(ordered_summary)getSumreturn(ordered_summary)或者乾脆ordered_summary行,所以你把它返回一個對象,你可以進一步處理。

lookup_function <- function(data_lookup, id_lookup, trial_lookup) { 
    data_df <- getRS(CNA = data_lookup) 
    summary_df <- getSum(df = data_df) 
    subset(x = results_df, subset = (ID == id_lookup & trial == trial_lookup)) 
} 

如果您願意,可以用簡潔的方式編寫此函數。

lookup_function <- function(data_lookup, id_lookup, trial_lookup) { 
    subset(x = getSum(getRS(data_lookup)), subset = (ID == id_lookup & trial == trial_lookup)) 
} 

或者,如果你不想有三個不同的功能,你可以創建具有getRS和內部本身定義getSum的功能。

lookup_function <- function(data_lookup, id_lookup, trial_lookup) { 
    data_df <- getRS(CNA = data_lookup) 
    summary_df <- getSum(df = data_df) 
    subset(x = results_df, subset = (ID == id_lookup & trial == trial_lookup)) 
} 

lookup_function <- function(data_lookup, id_lookup, trial_lookup) { 
    getRS <- function(CNA, samples = NULL, trial = NULL){ 
    race <- 
     racing.summary(subset(CNA, samplelist = samples, triallist = trial)) 
    race$number <- 
     (2^race$mean) * 2 

    race 
    } 

    getSum <- function(df) { 
    unordered_summary <- 
     df %>% 
     group_by(ID, trial) %>% 
     summarise(mean = mean(mean), 
       max.length = max(end - start), 
       max.number = max(number)) %>% 
     data.frame() 

    ordered_summary <- 
     data.frame(unordered_summary[order(unordered_summary$trial), ]) 

    ordered_summary 
    } 

    data_df <- getRS(CNA = data_lookup) 

    summary_df <- getSum(df = data_df) 

    subset(x = results_df, subset = (ID == id_lookup & trial == trial_lookup)) 
} 

我已編輯的代碼getSum,因爲我沒有看到一個理由罵summarize三次,而不是單一的時間。當然,你可以使用你自己的功能,因爲我不知道你手頭任務的細節。

+0

非常感謝!我很感激你花時間做到這一點,真的很喜歡編輯我現有的代碼的建議! –

相關問題