【问题标题】:Function to calculate median by column to an R dataframe that is done regularly to multiple dataframes用于按列计算 R 数据帧中位数的函数,该 R 数据帧定期对多个数据帧执行
【发布时间】:2021-04-25 05:03:43
【问题描述】:

尝试编写一个函数来组合在 R 数据帧上经常使用的多个步骤。目前我堆叠单独的行,这是最低效的。我现在采取的每一步都有一个例子

library(scores)
MscoreIndex <- 3


labMedians <- mapply(median, df[-1], na.rm = T) #calculate the median for each column except 1st
LabGrandMedian <- median(mapply(median, df[-1], na.rm = T),na.rm = T)
labMscore <- as.vector(round(abs(scores_na(labMedians, "mad")), digits = 2)) #calculate mscore by lab
labMscoreIndex <- which(labMscore > MscoreMax) #get the position in the vector that exceeds Mscoremax
df[-1][labMscoreIndex] <- NA # discharge values above threshold by making NA

下面是我的 df 示例

structure(list(Determination_No = 1:6, `2` = c(55.94, 55.7, 56.59, 
56.5, 55.98, 55.93), `3` = c(56.83, 56.54, 56.18, 56.5, 56.51, 
56.34), `4` = c(56.39, 56.43, 56.53, 56.31, 56.47, 56.35), `5` = c(56.32, 
56.29, 56.31, 56.32, 56.39, 56.32), `7` = c(56.48, 56.4, 56.54, 
56.43, 56.73, 56.62), `8` = c(56.382, 56.258, 56.442, 56.258, 
56.532, 56.264), `10` = c(56.3, 56.5, 56.2, 56.5, 56.7, 56.5), 
    `12` = c(56.11, 56.46, 56.1, 56.35, 56.36, 56.37)), class = "data.frame", row.names = c(NA, 
-6L))

我首先尝试使用以下方法获取单个实验室中位数和孙中位数,但出现错误

我试过了。

mediansFunction <- function(x){
              analytemedians <- mapply(median(x[,-1]))
              grandmedian <- median(x[,-1])
              list(analytemedians,grandmedian)
            }

mediansFunction(df)

但我得到“median.default(x[, -1]) 中的错误:需要数字数据”

【问题讨论】:

    标签: r function dataframe mapply


    【解决方案1】:

    试试:

    mediansFunction <- function(x){
      analytemedians <- sapply(x[-1], median)
      median_of_median <- median(analytemedians)
      grand_median <- median(as.matrix(x[-1]))
      
      list(analytemedians = analytemedians,
           median_of_median = median_of_median,
           grand_median = grand_median)
    }
    
    mediansFunction(df)
    
    #$analytemedians
    #     2      3      4      5      7      8     10     12 
    #55.960 56.505 56.410 56.320 56.510 56.323 56.500 56.355 
    
    #$median_of_median
    #[1] 56.3825
    
    #$grand_median
    #[1] 56.386
    

    【讨论】:

    • 感谢您的解决方案。一些后续问题为什么这次 mapply 不起作用,我可以将输出设置为数据框而不是列表,我可以在函数内不使用 return 或 list 将项目发送到全局环境吗?
    • 1.如果您使用analytemedians &lt;- mapply(median, x[-1], na.rm = T)mapply 会起作用。在您的代码中,您正在执行analytemedians &lt;- mapply(median(x[,-1])),这是不同的。 2. 你的输出数据框看起来如何?你能在这个例子的帮助下展示吗? 3. 你可以但你不应该,你应该像这样将函数的输出分配给变量result &lt;- mediansFunction(df)
    • 我有一个后续问题:stackoverflow.com/questions/67252056/…
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2014-12-23
    • 2017-05-28
    • 2020-12-14
    • 2017-06-26
    相关资源
    最近更新 更多