繁体   English   中英

如何从R中先前功能的输出创建新功能?

[英]How to create new function from output of previous function in R?

对于R编程和一般编程,我一无所知,但是我有两段遇到类似问题的代码(对我来说)。 开始了...

(一种)

我目前有一个返回患者记录,试验编号和其他信息的函数。 看起来像这样:

     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) }

我想知道是否有可能在新函数中使用此输出来执行简单的算术运算。 我想从“开始”中减去“完成”以创建“长度”,使用上面的所有方法创建一个新的“均值”,并提取最大的“数字”以创建“最大数字”,同时不显示“标记”完全没有

类似于以下的输出:

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

与/或

(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还是同时对这两个问题,任何帮助都将不胜感激! 甚至是有关指向有用网站的链接的建议。 :)

如果已经定义了函数getRSgetSum ,则可以在新函数中调用它们。

您只需getSum中包含View(ordered_summary)的行更改为return(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))
}

或者,如果您不想拥有三个不同的函数,则可以创建一个在其内部定义了getRSgetSum函数。

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 ,而不是单一的时间的三倍。 当然,您可以使用自己的功能,因为我不知道手头任务的细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM