使用 mutate_each 的数学运算
Mathematical operation using mutate_each
我想在 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`)
我的objective是利用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"))
有了 dplyr
我们可以 group_by
FY
。得到每组的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
我们可以使用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
我想在 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`)
我的objective是利用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"))
有了 dplyr
我们可以 group_by
FY
。得到每组的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
我们可以使用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