如何将lapply输出转换为R中的单个矩阵

时间:2017-03-17 21:31:08

标签: r lapply

我有一个按年份组织的数据框列表。我正在使用lapply来获取每个数据框中单个变量的摘要。输出在列表后面,并逐一给出每年的摘要。但是,我希望输出以单个表的形式显示行数。我该怎么做呢?使用虹膜数据集的示例显示了我的问题:

x <- split(iris$Sepal.Length, iris$Species)
lapply(x, summary)

输出是:

$setosa
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   4.300   4.800   5.000   5.006   5.200   5.800  

与其他两个相似。

我希望将输出组织为单个表,如:

> sapply(x, summary)
        setosa versicolor virginica
Min.     4.300      4.900     4.900
1st Qu.  4.800      5.600     6.225
Median   5.000      5.900     6.500
Mean     5.006      5.936     6.588
3rd Qu.  5.200      6.300     6.900
Max.     5.800      7.000     7.900

但是对于setosa,versicolor,virginica(或者在我的情况下是几年)左边和Min ... Max up up。我可以在ggplot中翻转轴,但是按照左边的年份,按原样读表是更直观的。我遇到了一些关于转换lapply输出的讨论,但我遇到的都是测量单个统计数据,如均值或中位数。感谢。

2 个答案:

答案 0 :(得分:1)

这似乎是使用by()的好时机。它消除了对split()的调用的需要,全部在一行中完成,并返回一个矩阵。

with(iris, do.call(rbind, by(Sepal.Length, Species, summary)))
#            Min. 1st Qu. Median  Mean 3rd Qu. Max.
# setosa      4.3   4.800    5.0 5.006     5.2  5.8
# versicolor  4.9   5.600    5.9 5.936     6.3  7.0
# virginica   4.9   6.225    6.5 6.588     6.9  7.9

如果您仍希望使用手动拆分 - 应用 - 合并方法,那么它将是

do.call(rbind, lapply(x, summary))

答案 1 :(得分:1)

如果你有一个大的data.frame,我建议不要将它分成片段,而是使用false按年分组。使用data.table数据集可以在

中完成
iris

library(data.table) setDT(copy(iris))[, as.list(summary(Sepal.Length)), by = Species] # Species Min. 1st Qu. Median Mean 3rd Qu. Max. #1: setosa 4.3 4.800 5.0 5.006 5.2 5.8 #2: versicolor 4.9 5.600 5.9 5.936 6.3 7.0 #3: virginica 4.9 6.225 6.5 6.588 6.9 7.9 确保as.list()的输出按要求按列显示。

结果是summary()(不是data.table),可以在后续matrix来电中直接使用。

请注意,此处仅需要ggplot(),因为copy(iris)数据集已锁定以防止修改其变量绑定。使用您自己的data.frame iris,您只需使用df强制执行data.table而无需复制。

附加

OP提到他使用结果与setDT(df)进行绘图。现在,ggplot2在以长格式提供数据时效果最佳。使用ggplot2

可以方便地将data.table从宽格式转换为长格式
melt()