数据帧列表中每个数据帧的列方差系数

Coefficient of variances by column to each dataframe in a list of dataframes

我编写了一个函数来计算我想要应用于数据帧列表的方差系数。但是该函数执行 returns 意外结果。它没有返回每个数据帧的每一列的结果,而是产生了没有意义的附加值。

下面是我的数据框列表示例

list(Fe = structure(list(Determination_No = 1:6, `2` = c(NA, 
NA, NA, NA, NA, NA), `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)), row.names = c(NA, 
-6L), class = "data.frame"), SiO2 = structure(list(Determination_No = 1:6, 
    `2` = c(7.63, 7.65, 7.73, 7.67, 7.67, 7.67), `3` = c(7.84, 
    7.69, 7.59, 7.77, 7.74, 7.64), `4` = c(7.67, 7.74, 7.62, 
    7.81, 7.66, 7.8), `5` = c(7.91, 7.84, 7.96, 7.87, 7.84, 7.92
    ), `7` = c(7.77, 7.83, 7.76, 7.78, 7.65, 7.74), `8` = c(7.936, 
    7.685, 7.863, 7.838, 7.828, 7.767), `10` = c(7.872684992, 
    7.851291827, 7.872684992, 7.722932832, 7.680146501, 7.615967003
    ), `12` = c(7.64, 7.71, 7.71, 7.65, 7.82, 7.68)), row.names = c(NA, 
-6L), class = "data.frame"), Al2O3 = structure(list(Determination_No = 1:6, 
    `2` = c(2.01, 2.02, 2.03, 2.01, 2.02, 2), `3` = c(2.01, 2.01, 
    2, 2.02, 2.02, 2.03), `4` = c(2, 2.03, 1.99, 2.01, 2.01, 
    2.01), `5` = c(2.02, 2.02, 2.05, 2.03, 2.02, 2.03), `7` = c(NA, 
    NA, NA, NA, NA, NA), `8` = c(2.053, 2.044, 2.041, 2.038, 
    2.008, 2.02), `10` = c(2.002830415, 2.021725042, 2.021725042, 
    1.983935789, 2.002830415, 2.021725042), `12` = c(NA, NA, 
    NA, NA, NA, NA)), row.names = c(NA, -6L), class = "data.frame"), 
    TiO2 = structure(list(Determination_No = 1:6, `2` = c(0.07, 
    0.07, 0.07, 0.07, 0.07, 0.07), `3` = c(NA, NA, NA, NA, NA, 
    NA), `4` = c(0.07, 0.07, 0.07, 0.07, 0.07, 0.07), `5` = c(0.07, 
    0.07, 0.07, 0.07, 0.07, 0.07), `7` = c(NA, NA, NA, NA, NA, 
    NA), `8` = c(NA, NA, NA, NA, NA, NA), `10` = c(0.066721378, 
    0.066721378, 0.066721378, 0.066721378, 0.066721378, 0.066721378
    ), `12` = c(NA, NA, NA, NA, NA, NA)), row.names = c(NA, -6L
    ), class = "data.frame"), Mn = structure(list(Determination_No = 1:6, 
        `2` = c(0.194, 0.209, 0.218, 0.22, 0.213, 0.217), `3` = c(0.222, 
        0.214, 0.21, 0.212, 0.205, 0.213), `4` = c(0.21, 0.21, 
        0.21, 0.22, 0.23, 0.2), `5` = c(0.23, 0.21, 0.22, 0.21, 
        0.2, 0.22), `7` = c(0.197, 0.238, 0.205, 0.223, 0.205, 
        0.214), `8` = c(0.217, 0.221, 0.237, 0.213, 0.227, 0.232
        ), `10` = c(0.21, 0.21, 0.22, 0.23, 0.21, 0.22), `12` = c(NA, 
        0.24, 0.23, 0.23, 0.22, 0.23)), row.names = c(NA, -6L
    ), class = "data.frame"), CaO = structure(list(Determination_No = 1:6, 
        `2` = c(0.08, 0.07, 0.07, 0.07, 0.08, 0.07), `3` = c(0.08, 
        0.07, 0.07, 0.07, 0.07, 0.07), `4` = c(NA, NA, NA, NA, 
        NA, NA), `5` = c(0.08, 0.07, 0.08, 0.07, 0.07, 0.07), 
        `7` = c(NA, NA, NA, NA, NA, NA), `8` = c(0.07, 0.071, 
        0.07, 0.067, 0.071, 0.07), `10` = c(0.069959326, 0.069959326, 
        0.069959326, 0.069959326, 0.069959326, 0.069959326), 
        `12` = c(NA, NA, NA, NA, NA, NA)), row.names = c(NA, 
    -6L), class = "data.frame"))




功能如下

labCV <- function(x,...){
  LabMean <- round(mapply(mean, x[-1], na.rm = T),digits = 2)
  Lab.GrandMean <- median(LabMean,na.rm=T)
  lab.SD <- round(mapply(sd, x[-1], na.rm = T), digits = 2)
  SD.All <- unlist(x[-1]) #convert all the values to a vector
  
  lab.cv <- as.vector(lab.SD/LabMean) *100
  lab.cvall <- ((SD.All / Lab.GrandMean) * 100)
  lab.cv.T <- format(round(lab.cv,2),nsmall = 2)
  lab.cvall.T <- format(round(lab.cvall,2),nsmall =2)
  CV.Summary <- c("Coeff. Variation", lab.cv.T, lab.cvall.T)
  return(CV.Summary)
  }

df.cv <- lapply(df, function(x) labCV(x,na.rm=T))

我只希望每个数据框中的每个实验室都有一个结果,但是我得到了

c("Coeff. Variation", "  NA", "0.39", "0.14", "0.05", "0.21", 
"0.21", "0.32", "0.27", `21` = "    NA", `22` = "    NA", `23` = "    NA", 
`24` = "    NA", `25` = "    NA", `26` = "    NA", `31` = "100.74", 
`32` = "100.23", `33` = " 99.59", `34` = "100.16", `35` = "100.18", 
`36` = " 99.88", `41` = " 99.96", `42` = "100.04", `43` = "100.21", 
`44` = " 99.82", `45` = "100.11", `46` = " 99.89", `51` = " 99.84", 
`52` = " 99.79", `53` = " 99.82", `54` = " 99.84", `55` = " 99.96", 
`56` = " 99.84", `71` = "100.12", `72` = " 99.98", `73` = "100.23", 
`74` = "100.04", `75` = "100.57", `76` = "100.37", `81` = " 99.95", 
`82` = " 99.73", `83` = "100.06", `84` = " 99.73", `85` = "100.22", 
`86` = " 99.74", `101` = " 99.80", `102` = "100.16", `103` = " 99.63", 
`104` = "100.16", `105` = "100.51", `106` = "100.16", `121` = " 99.47", 
`122` = "100.09", `123` = " 99.45", `124` = " 99.89", `125` = " 99.91", 
`126` = " 99.93")


9 rows/entries 之后我没想到会发生什么。不知道哪里出错了。

也许你只需要输出lab.cv.T

labCV <- function(x,...){
   LabMean <- round(mapply(mean, x[-1], na.rm = T),digits = 2)
   #...
   #...
   CV.Summary <- c("Coeff. Variation", lab.cv.T)
   return(CV.Summary)
}

下面得到了想要的结果


labCV <- function(x,...){
  lab.cv <- mapply(sd, x[-1], na.rm = T)/mapply(mean, x[-1], na.rm = T) *100
  LabCV.all <- round(sd(unlist(x[-1]), na.rm = T), digits = 4)/mean(mapply(mean, x[-1], na.rm = T),na.rm=T) *100
  cv.summmary <- c(lab.cv,LabCV.all)
  return(cv.summmary)
}