【问题标题】:R: efficient way to store boxplot.stats in data.frameR:将 boxplot.stats 存储在 data.frame 中的有效方法
【发布时间】:2015-03-05 15:14:05
【问题描述】:

我在 R 中工作,我有来自 143 个变量和大约 50000 个观察值的数据。数据存储为data.frame,称为TR。对于每个变量,我想将boxplot.stats 的结果存储在一个常见的data.frame 中,称为异常值。

我的第一次尝试是for-loop,但我想还有更有效的方法...

    for (n in 1:143) {Outlier[n] <- cbind(boxplot.stats(TR[,n]))} 

这行得通,但它很慢而且不漂亮。由于某种原因,它也不允许我设置colnames

到目前为止我的输出是:

print(Outlier)
[[1]]
[1]  -5.86250  33.30000  48.19875  71.00750 127.53750

[[2]]
[1]    0.00  150.75  357.25  706.75 1540.75

[[3]]
[1] -11.2900  30.0000  44.9900  59.9900 104.9725

以此类推,直到 [[143]]

我想要的是一个数据框,其中列名与原始数据集的列名相同(因此变量“age”的摘要将再次称为“age”而不是 [111] )。

我想某种形式的 apply-function 应该对我有用!?

感谢您的帮助!


编辑(编辑 2 次)

我想获得一个数据框,在其中计算每个变量(例如列)的相应统计信息。之前提出的解决方案反而给了我由于第一列(customer_ID)而位于相应胡须位置的条目的值。 (这也让我想到我应该删除 customer_ID,因为它的统计数据完全不相关,当然......)

我想要的是:

                customer_ID   age  ... 
lower whisker   1             4
lower ‘hinge’                 18
median           25000        45
upper ‘hinge’                 60
upper whisker   500000        89

【问题讨论】:

  • 你可以试试lapply(TR,boxplot.stats),你想保留什么数据?如果你只想保留第一个元素,你可以这样做:do.call("cbind",lapply(TR,function(x) boxplot.stats(x)$stats))
  • @CathG,我想保留所有 5 个值。
  • boxplot.stats 的结果中有 4 个元素:stats= 5 个“关键”值,n= 非 NA 观察的数量,conf=“CI " 和 out= 异常值。如果您只对 5 个关键值(下胡须的极值、下“铰链”、中值、上“铰链”和上胡须的极值)感兴趣,您可以使用我发布的答案中的方法。 (您可以通过从“var1”到“var10”命名的 10 个变量的示例来了解它是如何工作的)
  • jep - 抱歉表述不当。这正是我的意思。它工作得很好,也让我正确地得到了colnames。所以诀窍是使用lapply 而不是for 并指定boxplot$stats 而不是仅仅boxplot。我的下一个任务是阅读do.call-function。

标签: r for-loop apply


【解决方案1】:

如果你只想保留第一个元素(“stats”),你可以这样做:

 do.call("cbind", lapply(TR, function(x) boxplot.stats(x)$stats))

示例:

TR<-data.frame(matrix(rnorm(1000, 0, 1), nrow=100))
colnames(TR) <- paste0("var", 1:10)

result <- do.call("cbind",lapply(TR,function(x) boxplot.stats(x)$stats))
row.names(result) <- c("lower whisker", "lower hinge", "median", "upper hinge", "upper whisker")

> result
#                        var1       var2        var3       var4        var5        var6       var7       var8       var9       var10
# lower whisker  -2.576439995 -2.2792196 -2.35167507 -1.8877539 -2.58913827 -2.16186578 -2.2256634 -2.6224338 -2.6553318 -2.20051934
# lower hinge    -0.702412927 -0.8807600 -0.51379104 -0.8844453 -0.70669242 -0.67969000 -0.4659781 -0.9299630 -0.6832023 -0.75777439
# median         -0.001227173 -0.1061840  0.05179841 -0.1814486  0.07202305 -0.05771931  0.1607952 -0.1093029  0.1497963  0.02718001
# upper hinge     0.713235646  0.6534857  0.86043753  0.5778967  0.60288720  0.35219547  0.7317339  0.5787307  0.7458351  0.78165452
# upper whisker   2.596567487  2.2561072  2.66626361  1.7087384  2.24049360  1.81568251  1.9378385  2.5409711  2.3770803  3.01762144    

【讨论】:

  • 仔细查看我得到的结果实际上告诉我这不是我想要的。相反,它为我提供了下须线、下“铰链”、中值、上“铰链”和上须线的极值处的条目值,按 ID。 :( 我想要的是为每个变量计算这些数字。
  • @PikkuKatja,首先,我真的很抱歉我把 row.names 放得太快了,复制/粘贴你在你的问题中提出的内容(最少,25%...)但实际上这与boxplot.stats 计算的值不对应理解它,因为计算的实际上是每个变量的不同统计数据......你能用你的输入 data.frame 和所需的输出编辑你的问题吗?
  • 嘿@CathG,我自己发现了胡须,并在上次编辑中更正了它。实际上,即使这不是我要找的数字,它们仍然被证明是有用的。嗯,如果如你所说,分别为每一列计算统计数据,我想我需要做的是非常仔细地查看我的数据,看看我得到的奇怪结果来自哪里。如果我实际上还有一个编程问题(而不仅仅是数据格式错误的问题),我会回复你 :-) 谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
相关资源
最近更新 更多