将具有不同列的lapply的结果放到一个数据框中

时间:2017-07-16 06:44:21

标签: r lapply rbind

我正在处理数据集,并希望对某些变量进行一些描述性统计,并将它们放在一个数据框中。 我可以处理这样的情况:

dt<-data.frame('X1'=rnorm(10),
           'X2'=rnorm(10))
temp<-do.call(rbind, lapply(dt, summary))

还有这样的情况:

dt<-data.frame('X1'=rnorm(10),
           'X2'=rnorm(10))
dt[1,2]<-NA
dt[2,1]<-NA
temp<-do.call(rbind, lapply(dt, summary))

但是当谈到下面的情况时,我不能:

dt<-data.frame('X1'=rnorm(10),
           'X2'=rnorm(10))
dt[1,2]<-NA
temp<-do.call(rbind, lapply(dt, summary))

当某些变量包含NA而某些变量不包含NA时,不同变量的 lapply 的结果会有不同的列:

> lapply(dt, summary)
$X1
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.7821000 -0.2881000 -0.0003675  0.3195000  0.8114000  2.0230000 

$X2
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
-1.336000 -0.604000 -0.005283  0.008491  0.784300  1.407000         1 

在这种情况下rbind将不再起作用。我确实知道有rbnd.fill可以在数据帧具有不同列时进行行绑定但是将每个变量的结果传递到数据帧然后通过rbind.fill将它们组合起来会是某种乏味的我会这样做相信有权力R有一个命令解决方案。

希望有人可以帮助我,你的时间和知识将深受赞赏!

3 个答案:

答案 0 :(得分:4)

您可以将rbind.fill与来自tidy套餐的broom合并,一次性获取,即

plyr::rbind.fill(lapply(dt, function(i) broom::tidy(summary(i))))
#    minimum         q1     median        mean         q3   maximum na
#1 -1.621968 -0.7001894 -0.2062857  0.06791479  0.5987752 2.4195609 NA
#2 -2.061762 -1.3925008 -1.1702881 -0.94991206 -0.9249380 0.6052219  1

答案 1 :(得分:2)

使用 tidyverse 方式的答案,即<Button x:Name="btn" Content="Hover me"/> <TextBlock x:Name="tb" Text="Input"> <TextBlock.Style> <Style TargetType="{x:Type TextBlock}"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=btn, Path=IsMouseOver}" Value="True"> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:1" AutoReverse="true" RepeatBehavior="1x"> </DoubleAnimation> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> 主要是:

purrr

对于您正在做的事情,您也可以对ropensci社区正在进行的有关dt<-data.frame('X1'=rnorm(10), 'X2'=rnorm(10)) dt[1,2]<-NA library(purrr) library(broom) dt %>% map(., summary) %>% map_df(broom::tidy) #> minimum q1 median mean q3 maximum na #> 1 -0.798480 0.5869163 0.89381256 0.9626454 1.6942529 2.218769 NA #> 2 -1.331122 -1.0149286 0.05946167 -0.1562312 0.5235401 1.061640 1 一揽子计划的工作感兴趣。它不是在CRAN上,而是在github上。它旨在简化摘要统计使用,与 tidyverse 方法

兼容
skimr

答案 2 :(得分:0)

仅使用plyr包,您可以将强制as系列函数与plyr::rbind.fill一起使用,以使用与原始帖子类似的代码来完成您想要的操作。 plyr::rbind.fill需要data.frame,因此我们首先将summary(命名向量)的输出转换为列表,然后使用as.data.frame.list转换为data.frame。

do.call(plyr::rbind.fill, lapply(dt, function(x) as.data.frame.list(summary(x))))

返回

        Min.   X1st.Qu.     Median        Mean    X3rd.Qu.      Max. NA.s
1 -1.3228095 -0.9366220  0.3869426  0.05838389  0.85474059 1.1721839   NA
2 -0.8421435 -0.5083617 -0.4801625 -0.29357112 -0.02549078 0.4506287    1