R:在data.frame中存储boxplot.stats的有效方法
我在R工作,我有143个变量的数据和大约50000个观察值。数据被存储为R:在data.frame中存储boxplot.stats的有效方法,r,for-loop,apply,R,For Loop,Apply,我在R工作,我有143个变量的数据和大约50000个观察值。数据被存储为data.frame称为TR。对于每个变量,我想将boxplot.stats的结果存储在一个公共data.frame中,这被称为离群值 我的第一次尝试是一个for-循环,但我想还有更有效的方法 for (n in 1:143) {Outlier[n] <- cbind(boxplot.stats(TR[,n]))} 等等,直到[[143]] 我想要的是一个数据帧,其中的列名与原始数据集的列名相同(因此变量“
data.frame
称为TR。对于每个变量,我想将boxplot.stats
的结果存储在一个公共data.frame
中,这被称为离群值
我的第一次尝试是一个for
-循环,但我想还有更有效的方法
for (n in 1:143) {Outlier[n] <- cbind(boxplot.stats(TR[,n]))}
等等,直到[[143]]
我想要的是一个数据帧,其中的列名与原始数据集的列名相同(因此变量“age”的摘要将再次称为“age”,而不是[111])
我想某种形式的apply
-函数应该适合我
谢谢你的帮助
编辑(编辑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
如果只想保留第一个元素(“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
TR如果只想保留第一个元素(“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
TR您可以尝试lappy(TR,boxplot.stats)
,您希望保留哪些统计信息?如果您只想保留第一个元素,您可以这样做:do.call(“cbind”,lappy(TR,function(x)boxplot.stats(x)$stats))
@CathG,我想保留所有5个值。boxplot.stats
的结果中有4个元素:stats
=5个“键”值,n
=非NA观察值的数量,conf
=CI”和out
=异常值。如果你只是对5个关键值感兴趣(下胡须的极值、下“铰链”、中间值、上“铰链”和上胡须的极值),你可以使用我发布的答案中的方法。(您可以通过名为“var1”到“var10”的10个变量的示例了解它的工作原理)jep-很抱歉这个糟糕的公式。这正是我的意思。它工作得非常好,而且还正确地为我提供了colname
。所以诀窍是使用lappy
而不是for
的,并指定boxplot$stats
而不是boxplot
。我的下一个任务是阅读do.call
-function。您可以尝试lappy(TR,boxplot.stats)
,您想保留哪些统计信息?如果您只想保留第一个元素,可以执行:do.call(“cbind”,lappy(TR,function(x)boxplot.stats(x)$stats))
@CathG,我想保留所有5个值。箱线图的结果中有4个元素。stats
:stats
=5个“关键”值,n
=非NA观测值的数量,conf
=CI”和out
=异常值。如果您对这5个关键值感兴趣(下须的极端、下‘铰链’、中间、上‘铰链’和上须的极端),您可以使用我发布的答案中的方法。(您可以看到它是如何与从“var1”到“var10”的10个变量示例一起工作的)jep-很抱歉这个糟糕的公式。这正是我的意思。它工作得非常好,而且还正确地为我提供了colname
。所以诀窍是使用lappy
而不是for
的,并指定boxplot$stats
而不是boxplot
。我的下一个任务是阅读do.call代码>-函数。仔细查看我得到的结果实际上表明,这不是我想要的。相反,它为我提供了位于下须、下“铰链”、中间、上“铰链”和上须末端的条目值,通过ID:(取而代之的是,我要计算每个变量的数字。@PikkuKatja,首先,我真的很抱歉我把row.names放得太快了,复制/粘贴了您在问题中输入的内容(最小,25%…),但实际上这与boxplot.stats
:-()(这是我在之前的评论中所做的…)所以这是正确的,但再一次,对不起。关于你的评论,我真的不明白,因为计算出来的实际上是每个变量的不同统计数据…你能用你的输入数据编辑你的问题吗。框架和期望的输出?嘿@CathG,我自己发现了关于胡须的问题,我在上一次编辑中更正了它。事实上,甚至虽然这不是我想要的数字,但它们仍然被证明是有用的。嗯,如果,如你所说,每个列的统计数据都是分别计算出来的,我想我需要做的是仔细查看我的数据,看看我得到的奇怪结果来自何方。如果我还真的有编程问题的话(不仅仅是数据格式错误的问题),我会给你回复:-)感谢您的帮助!仔细查看我得到的结果实际上表明,这不是我要查找的。相反,它为我提供了位于下胡须、下“铰链”、中间、上“铰链”和上胡须末端的条目的值,通过ID:(取而代之的是,我要计算每个变量的数字。@PikkuKatja,首先,我真的很抱歉我把row.names放得太快了,复制/粘贴了您在问题中输入的内容(最小,25%…),但实际上这与boxplot.stats
:-()(这是我在之前的评论中所做的…)这是正确的,但再次抱歉。关于你的评论,我不太理解,因为计算出来的实际上是每个变量的不同统计数据…你能用你的输入数据编辑你的问题吗。frame和desired out