【问题标题】:Mathematical operation using mutate_each使用 mutate_each 的数学运算
【发布时间】:2017-06-20 10:06:54
【问题描述】:

我想以mutate_each / summarise_each in dplyr: how do I select certain columns and give new names to mutated columns? 线程为基础。它谈到将 mutate 应用于多个列。但是,我知道我们可以使用 sum 等函数,但我不确定如何应用数学运算,例如加法、乘法、除法和减法。

这是我的数据:

dput(DF)
structure(list(FY = c(2015, 2016, 2017, 2030, 2015, 2016, 2017, 
2030, 2015, 2016, 2017, 2030, 2015, 2016, 2017, 2030, 2015, 2030
), Value = c(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
19, 20, NA, NA)), .Names = c("FY", "Value"), row.names = c(NA, 
18L), class = "data.frame")

这是我的工作代码,向您展示我想要什么:

DF<-DF %>% 
  dplyr::group_by(FY) %>%
  dplyr::summarise(Numbers = sum(Value,na.rm = TRUE)) %>%
  spread(FY,Numbers)

DF$`2016`<-DF$`2016` + DF$`2030`/3
DF$`2017`<-DF$`2017` + DF$`2030`/3
DF$`2015`<-DF$`2015` + DF$`2030`/3
DF$`2030`<-NULL

DF <- DF %>%
gather(FY,Values,`2015`:`2017`)

我的目标是使用mutate_each() 自动执行以下代码行并减少重复。我不确定如何使用 mutate 计算 2030 列的 1/3,然后将其添加回 2016

   DF$`2016`<-DF$`2016` + DF$`2030`/3
    DF$`2017`<-DF$`2017` + DF$`2030`/3
    DF$`2015`<-DF$`2015` + DF$`2030`/3

我能做些什么来减少重复?


应用上述操作后的预期输出:

dput(DF)
structure(list(FY = c("2015", "2016", "2017"), Values = c(62.6666666666667, 
66.6666666666667, 70.6666666666667)), row.names = c(NA, -3L), .Names = c("FY", 
"Values"), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • mutate_each 创建列,但这里总结了您的预期输出
  • @akrun--如果我错了,请纠正我。 mutate_each 不是用于将函数应用于数据集中的每一列吗?因此,假设我的数据集中有三列(上图)--2015, 2016 and 2017,我们不能在每一列上使用mutate_each 来执行数学运算吗?我很好奇。提前感谢您的所有帮助...

标签: r dplyr tidyr


【解决方案1】:

我们可以使用data.table

library(data.table)
setDT(DF)[FY %in% 2015:2017, .(NewValue = sum(Value, na.rm = TRUE) + 
                  sum(DF[FY==2030]$Value, na.rm=TRUE)/3), by = FY]
#     FY NewValue
#1: 2015 62.66667
#2: 2016 66.66667
#3: 2017 70.66667

【讨论】:

    【解决方案2】:

    有了dplyr,我们可以group_byFY。获取每个组的sum 并将FY 2030 的1/3 部分添加到所有sum

    library(dplyr)
    DF %>%
       group_by(FY) %>%
       summarise(Sum = sum(Value, na.rm = TRUE)) %>%
       mutate(NewValue = Sum + Sum[FY == '2030']/3) %>%
       filter(FY != 2030)
    
    #    FY   Sum  NewValue
    #  <dbl> <dbl>    <dbl>
    #1  2015    44 62.66667
    #2  2016    48 66.66667
    #3  2017    52 70.66667
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多