df的代码:
df <- data.table(" " = c("Actual"),
"2011" = c(3),
"2012" = c(4),
"2013" = c(2),
"2014" = c(5),
"2015" = c(10),
"2016" = c(3),
"2017" = c(12)
)
如下所示:
2011 2012 2013 2014 2015 2016 2017
1 Actual 3 4 2 5 10 3 12
我想通过采用2011-2014年的平均值在2015、2016和2017列下创建新行(第2行),
2011 2012 2013 2014 2015 2016 2017
1 Actual 3 4 2 5 10 3 12
2 Average 0 0 0 0 10 - (3+4+2+5/5) 3 - (3+4+2+5/5) 12 - (3+4+2+5/5)
所以在计算之后,取第1行和第2行的总和,看起来像这样
2011 2012 2013 2014 2015 2016 2017
1 Actual 3 4 2 5 10 3 12
2 Average 0 0 0 0 7.2 0.2 9.2
3 Sum 3 4 2 5 17.2 3.2 21.2
首先,我尝试采用2011年至2014年的第一个平均值
rowMeans(subset(df, select = c("2011", "2012", "2013", "2014")), na.rm = TRUE)
这可行,但随后我尝试将其绑定为以下特定行:
df <- bind_rows(df[, 5:7],
rowMeans(subset(df, select = c("2011", "2012", "2013", "2014")), na.rm = TRUE)))
但是,这没有用。一旦该代码生效,我计划从该平均值中减去实际数字,然后取第1行和第2行之和。
任何帮助将不胜感激!提前非常感谢您。
答案 0 :(得分:1)
我在理解上有些困难,但是我认为这可能是您想要的。如果没有,我仍然建议使用这种数据分析风格。它使用了一个非常流行的名为tidyverse
的库。它具有很多非常好的功能。它也有%>%
,它是一个运算符,它接受前面的所有内容,并将该值输入为后续函数的第一个参数。
# a really nice library for writing cleaner data analysis in R
library(tidyverse)
# Make the data into a long form data frame, so it's easier to work with
df = df[,2:ncol(df)] %>%
gather("Year", "Actual") %>%
as.data.frame()
# Year Actual
# 1 2011 3
# 2 2012 4
# 3 2013 2
# 4 2014 5
# 5 2015 10
# 6 2016 3
# 7 2017 12
df %>%
# make the average column
mutate(AverageUpTo2014 = mean(Actual[Year <= 2014])) %>%
# make the difference column
mutate(DifferenceFromAverage = Actual - AverageUpTo2014) %>%
# and you could change the earlier values to zeros if you want
mutate(DifferenceFromAverage = ifelse(Year <= 2014, 0,
DifferenceFromAverage))
# Year Actual AverageUpTo2014 DifferenceFromAverage
# 1 2011 3 3.5 0
# 2 2012 4 3.5 0
# 3 2013 2 3.5 0
# 4 2014 5 3.5 0
# 5 2015 10 3.5 6.5
# 6 2016 3 3.5 -0.5
# 7 2017 12 3.5 8.5