通过计算将行添加到特定列

时间:2018-12-07 00:55:09

标签: r data.table

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行之和。

任何帮助将不胜感激!提前非常感谢您。

1 个答案:

答案 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