【问题标题】:User defined function which computes mean of specific dataframe rows and replaces them, applied on a list of dataframes用户定义的函数,它计算特定数据帧行的平均值并替换它们,应用于数据帧列表
【发布时间】:2019-11-20 08:03:10
【问题描述】:

我的问题实际上包含两个问题: 1.创建一个用户定义的函数,根据条件替换行 2. 将其应用于数据框列表

第一个问题: 例如,当我们有以下数据框时:

Year Measurement1 Measurement2
2010 5            6
2011 4            2
2011 6            4
2011 2            1
2012 1            4
2012 5            10
2013 6            1

我想创建一个用户定义的函数,它计算具有相同年份(条件)的行的平均值,并将具有相同年份的行替换为具有计算平均值的行。 (不幸的是,我每年的行数都不一样。)

对于数据框:

Year Measurement1 Measurement2
2010 5            6
2011 6            3.5
2012 3            7
2013 6            1

第二个问题: 如果有办法创建这样一个用户定义的函数,我如何将它应用于数据框列表,例如用

创建
dfs = Filter(function(x) is(x, "data.frame"), mget(ls()))

非常感谢任何帮助! 提前谢谢!

【问题讨论】:

  • 查看dplyr 包。特别是你想看看group_bysummarise

标签: r


【解决方案1】:

以下是使用基本 R aggregate 将其应用于一个数据帧的方法

aggregate(cbind(Measurement1, Measurement2)~Year, df, mean)

#  Year Measurement1 Measurement2
#1 2010            5        6.000
#2 2011            4        2.333
#3 2012            3        7.000
#4 2013            6        1.000

现在假设您想将其应用于数据帧列表(例如list_df),您可以使用lapply

lapply(list_df, function(df) aggregate(cbind(Measurement1, Measurement2)~Year, df, mean))

如果我们有多个列到aggregate,我们可以创建一个formula 对象

Names <- c("Measurement1", "Measurement2")
aggregate(formula(paste0("cbind(", paste(Names, collapse = " , "), ")~Year")), df, mean)

#  Year Measurement1 Measurement2
#1 2010            5  6.000000000
#2 2011            4  2.333333333
#3 2012            3  7.000000000
#4 2013            6  1.000000000

【讨论】:

  • 感谢您的解决方案 :) 实际上我有 72 列可以执行此任务。因此,我创建了一个列表 Names 及其名称(“字符”),并在您的输入中按以下方式输入:aggregate(cbind(get(Names))~Year, df, mean) 不幸的是,这在 Year 列旁边只给了我一列作为输出。
  • @Mcgroger 我们可以用它创建一个公式对象。请参阅我的更新答案。
  • 这给了我以下错误:Error in aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) : no rows to aggregate 所以看起来它确实计算了平均值,但不知道把它放在哪一行。
  • @Mcgroger 这意味着对于列表中的某些数据框有 0 行。你能检查一下any(sapply(list_df, nrow) == 0) 的输出是什么吗?
  • @Ronak Shah 对于any(sapply(list_df, nrow) == 0) 我得到FLASE 作为回报。
【解决方案2】:

正如Cettt所说,你可以使用dplyr

df %>% 
  group_by(Year) %>%
  summarise(mean1 = mean(M1),mean2 = mean(M2))

# A tibble: 4 x 3
   Year mean1 mean2
  <dbl> <dbl> <dbl>
1  2010     5  6   
2  2011     4  2.33
3  2012     3  7   
4  2013     6  1  

【讨论】:

    【解决方案3】:

    第一个问题,请使用data.table

     library(data.table)
    
     dt <- as.data.table(YourData)
     dt[,.(Measurement1_mean=mean(Measurement1), Measurement2_mean=mean(Measurement2)),by=Year]
    

    【讨论】:

      【解决方案4】:

      对于base R,除了@Ronak Shah 的aggreate() 解决方案,您还可以使用aveunique() 来实现:

      unique(with(df,
                  data.frame(
                    Year = Year,
                    Measurement1=ave(Measurement1,Year),
                    Measurement2=ave(Measurement2,Year))))
      

      给出:

        Year Measurement1 Measurement2
      1 2010            5     6.000000
      2 2011            4     2.333333
      5 2012            3     7.000000
      7 2013            6     1.000000
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        相关资源
        最近更新 更多