【问题标题】:Add row in R dataframe by unique factor in column showing percent change by Month在 R 数据框中按唯一因子在 R 数据框中添加行,按月显示百分比变化
【发布时间】:2015-12-30 19:36:19
【问题描述】:

我有一个如下所示的数据框:它只显示 MTD:12 和 11,并且多年来它只显示 2014 年和 2015 年。

testing

   MONTH         YEAR  Client   Revenue     Col1              Col2      Col3       Col4
     MTD: 12     2014     A.    3203821   651404245        477505485 73.304018  6.709496
     MTD: 11     2014     A.    2052195   484668751        334657718 69.048751  6.132221
     MTD: 11     2014     B.    1668958   533246253        305447319 57.280725  5.463978
     MTD: 12     2015     C.    1524561  3931961251        237707315  6.045515  6.413607
     MTD: 12     2015     D.    1506985   171367458        114716359 66.941740 13.136618
     MTD: 12     2014     C.    1380678   436264756        250622785 57.447406  5.508990


testing2<-split(testing, testing$Client)

sapply(testing2, ifelse(testing2$MONTH=="MTD:12", (insert row below that shows % change of every column with previous year), testing2)

然后我想将其拆开并重新组合在一起。

【问题讨论】:

  • 请考虑阅读How to Ask 以及如何生成reproducible example
  • 好的,抱歉,我将重新创建它以使其可重现
  • 不要重新创建它,编辑您的问题。包括你自己的努力来解决这个问题。
  • 不要。做。这个。将两种不同类型的数据放在一列中被认为是不好的做法,以后会给您带来问题。最好创建一个“更改”列。
  • 我需要拆分它,因为百分比变化必须由客户进行

标签: r dataframe row


【解决方案1】:

也许这会有所帮助。

# sample data frame for testing code
testing <- data.frame(
  MONTH = c("MTD: 12", "MTD: 12", "MTD: 11", "MTD: 12", "MTD: 12", "MTD: 12"), 
  YEAR = c(2012, 2013, 2014, 2015, 2013, 2014), 
  Client = c("A.", "A.", "A.", "B.", "B.", "B."), 
  Revenue = c(320, 205, 166L, 152, 150, 138),
  Col1 = c(651, 485, 533, 3932, 171, 436), 
  Col2 = c(478, 335, 305, 238, 115, 251), 
  Col3 = c(73, 69, 57, 6, 67, 57), 
  Col4 = c(6.7, 6.1, 5.5, 6.4, 13.1, 5.5)
)

# subset just the month=12 rows
test12 <- testing[testing$MONTH=="MTD: 12", ]
test12 <- test12[order(test12$Client, test12$YEAR), ]

# define a function to calculate percent change
pctchange <- function(x) {
  L <- length(x)
  c(NA, 100 * (x[-1] - x[-L]) / x[-L])
}

# calculate percent change for all columns, by client
change <- apply(test12[, c("Revenue", "Col1", "Col2", "Col3", "Col4")], 2,
  function(y) unlist(tapply(y, test12$Client, pctchange)))
change <- data.frame(change)
names(change) <- paste0("d", names(change))
test12b <- cbind(test12[, c("MONTH", "YEAR", "Client")], change)

# merge back with monthly data
merge(testing, test12b, all=TRUE)

【讨论】:

  • 您回答的一个问题对我有用。我现在如何拆分它,以便百分比变化在每个客户之下。所以基本上我试图为每个客户创建一个单独的表,前两行是每月值,然后我想在每个客户的每列下添加百分比变化。 @让·V·亚当斯
  • 我建议您将其作为一个新问题发布,并附上一个可重现的示例。见stackoverflow.com/a/5963610/2140956
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多