对于我的数据框中的每个col,执行一个函数并将其结果添加到新的数据框中?

时间:2018-03-02 19:54:32

标签: r dataframe dplyr

我有一个以下格式的数据框(第一行对应某个名称的数字列;数据可能丢失) -

    col1.name  |  col2.name  |  col3.name  |  ...
    132        |  12.1       |  NA         |  ...
    12.4       |  NA         |  14.6       |  ...
    13         |  1441       |  535        |  ...

对于每一列,我想计算它的均值,中位数和标准差,并将它们添加到格式的数据框中 -

    col.name   |  mean       |  median     |  sd
    col1.name  |  123        |  456        |  12.2
    col2.name  |  12.1       |  45         |  32.1
    col3.name  |  111        |  14.6       |  69.2
    ...        |  ...        |  ...        | ...

我目前有以下代码;但它给我一个'x'错误必须是数字。我该怎么办呢?

<?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
             <section name="cacheSettings" type="Common.Configuration.CacheSettings, Common" restartOnExternalChanges="true" />
        </configSections>
    </configuration>

4 个答案:

答案 0 :(得分:1)

如果您首先重塑长形,例如使用tidyr::gather,其余的是非常典型的聚合:

library(tidyverse)

df <- data.frame(col1.name = c(132, 12.4, 13), 
                 col2.name = c(12.1, NA, 1441), 
                 col3.name = c(NA, 14.6, 535))

df %>% 
    gather(col.name, value) %>% 
    group_by(col.name) %>% 
    summarise(mean = mean(value, na.rm = TRUE), 
              median = median(value, na.rm = TRUE), 
              sd = sd(value, na.rm = TRUE))
#> # A tibble: 3 x 4
#>   col.name   mean median     sd
#>   <chr>     <dbl>  <dbl>  <dbl>
#> 1 col1.name  52.5   13.0   68.9
#> 2 col2.name 727.   727.  1010. 
#> 3 col3.name 275.   275.   368.

summaryskimr::skim也提供类似的摘要。

答案 1 :(得分:0)

首先确保所有列都是数字的:它们似乎可能是,但也许它们不是。如果你sapply(data,class),你将得到列的类。或做str(data)。要解决这个问题:

data=rapply(data,as.numeric,how="replace")

现在您可以将代码应用于数据

答案 2 :(得分:0)

这很有效。

df <- data.frame(col1name = c(132, 12.4, 13), col2name = c(12.1,NA,1441), col3name = c(NA,14.6,535))
new_df <- data.frame(col_name = colnames(df))

for(i in c('mean','median','sd'))
{
    new_df[[i]] <- apply(t(df),2,eval(i), na.rm=T)
}

print(new_df)

  col_name   mean median         sd
1 col1name  72.05  72.05  84.782103
2 col2name  13.50  13.50   1.555635
3 col3name 663.00 535.00 722.553804

答案 3 :(得分:0)

使用data.frame d

d <- data.frame(a=1:3, b=4:6, c=c(5,5,5))

你可以做到

t(apply(d, 2, function(i) c(mean=mean(i), median=median(i), sd=sd(i))))
#  mean sd sum
#a    2  1   6
#b    5  1  15
#c    5  0  15

如果你有NA来照顾

t(apply(d, 2, function(i, ...) c(mean=mean(i,...), median=median(i,...), sd=sd(i,...)), na.rm=TRUE))