【问题标题】:For each col in my dataframe, perform a function and add its results to a new dataframe?对于我的数据框中的每个 col,执行一个函数并将其结果添加到一个新的数据框中?
【发布时间】:2018-08-11 02:21:18
【问题描述】:

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

col1.name | col2.name | col3.name | ... 132 | 12.1 |不适用 | ... 12.4 |不适用 | 14.6 | ... 13 |第1441章第535章...

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

col.name |意思|中位数 | sd col1.name | 123 |第456章12.2 col2.name | 12.1 | 45 | 32.1 col3.name | 111 | 14.6 | 69.2 ... | ... | ... | ...

我目前有以下代码;但它给了我一个错误,“x”必须是数字。我该怎么做?

data.frame(ID=hvbp.analysis.df[,1], Means=rowMeans(hvbp.analysis.df[,-1]))
apply(hvbp.analysis.df, 2, mean, na.rm = TRUE)

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案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 也提供类似的摘要。

    【讨论】:

      【解决方案2】:

      首先确保您的所有列都是数字:它们可能看起来是,但也可能不是。如果您这样做sapply(data,class),您将获得列的类。或做str(data)。解决这个问题:

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

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

      【讨论】:

        【解决方案3】:

        这行得通。

        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
        

        【讨论】:

          【解决方案4】:

          带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
          

          如果你有NAs 需要照顾

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

          【讨论】:

            猜你喜欢
            • 2019-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-27
            • 2021-08-19
            • 2018-05-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多