【问题标题】:Function that calculates a table with confidence interval and mean for any data frame计算任何数据帧的置信区间和均值表的函数
【发布时间】:2021-12-07 02:42:42
【问题描述】:

我正在尝试编写一个接受三个参数 X、Y、Z 的函数,其中 X 是数字向量,Y 是对 X 进行分组的因子向量,Z 是置信区间的 alpha。我已经在函数之外编写了代码,以便学习并首先尝试它是否正常工作。这是我到目前为止得到的:

data(chickwts)

groups <- as.factor(chickwts[,2])
nr_groups <- levels(groups)

result <- matrix(0, nrow = length(nr_groups), ncol = 4)
colnames(result) <- c("Lower CI", "Mean", "Upper CI", "Obs.")
rownames(result) <- levels(groups)

result[,4] <- table(chickwts[,2])

group_test <- by(chickwts[, 1], groups, t.test)

for (i in levels(groups)) {
  tva <- (group_test[[i]])
  result[,1] <- tva$conf.int
  result[,3] <- tva$conf.int
  result[,2] <- tva$estimate
  
}

调用结果并没有给我我想要的:

result
          Lower CI     Mean Upper CI Obs.
casein    297.8875 328.9167 297.8875   12
horsebean 359.9458 328.9167 359.9458   10
linseed   297.8875 328.9167 297.8875   12
meatmeal  359.9458 328.9167 359.9458   11
soybean   297.8875 328.9167 297.8875   14
sunflower 359.9458 328.9167 359.9458   12

您可以看到除 Obs 之外的列中的所有值。错了。我正在尝试在基本 R 中编写代码并且没有任何包。有人可以让我知道如何进行以及我做错了什么吗?谢谢!

【问题讨论】:

  • 首先,您在 for 循环的每次迭代中都覆盖了整个列,其次,您对 result[,1] &lt;- tva$conf.intresult[,3] &lt;- tva$conf.int 使用相同的值,第三,conf.int 的长度为 2

标签: r function loops


【解决方案1】:
data(chickwts)

groups <- as.factor(chickwts[,2])
nr_groups <- levels(groups)

result <- matrix(0, nrow = length(nr_groups), ncol = 4)
colnames(result) <- c("Lower CI", "Mean", "Upper CI", "Obs.")
rownames(result) <- levels(groups)

result[,4] <- table(chickwts[,2])

group_test <- by(chickwts[, 1], groups, t.test)

for (i in levels(groups)) {
  tva <- (group_test[[i]])
  result[i, 1] <- tva$conf.int[1]
  result[i, 3] <- tva$conf.int[2]
  result[i, 2] <- tva$estimate
  
}

返回:

          Lower CI     Mean Upper CI Obs.
casein    282.6440 323.5833 364.5226   12
horsebean 132.5687 160.2000 187.8313   10
linseed   185.5610 218.7500 251.9390   12
meatmeal  233.3083 276.9091 320.5099   11
soybean   215.1754 246.4286 277.6818   14
sunflower 297.8875 328.9167 359.9458   12

【讨论】:

  • 谢谢达里奥!如此简单/愚蠢的错误。如何更改 t.test 的置信区间? group_test &lt;- by(chickwts[, 1], groups, t.test(conf.level = 0.99)) 不起作用。
  • 根据?by我们必须使用:group_test &lt;- by(chickwts[, 1], groups, t.test, conf.level = 0.99)
【解决方案2】:

这是lapply的方式。

data(chickwts)

groups <- factor(chickwts[, 2])
group_test <- by(chickwts[, 1], groups, t.test)

result <- lapply(group_test, \(tva){
  res <- numeric(3)
  res[1] <- tva$conf.int[1]
  res[3] <- tva$conf.int[2]
  res[2] <- tva$estimate
  res
})
result <- do.call(rbind, result)
colnames(result) <- c("Lower CI", "Mean", "Upper CI")
result <- cbind(result, `Obs.` = table(chickwts[, 2]))

result
#          Lower CI     Mean Upper CI Obs.
#casein    282.6440 323.5833 364.5226   12
#horsebean 132.5687 160.2000 187.8313   10
#linseed   185.5610 218.7500 251.9390   12
#meatmeal  233.3083 276.9091 320.5099   11
#soybean   215.1754 246.4286 277.6818   14
#sunflower 297.8875 328.9167 359.9458   12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多