按列表中的元素重新排序列表并删除列表中的指定行

时间:2016-01-07 17:14:03

标签: r split reorderlist

继续这个问题:Add row in R dataframe by unique factor in column showing percent change by Month

then

因此,运行此代码后,您将获得一个已被客户端拆分的列表。

如果该因子(客户端)的行数大于2,我想运行以下代码,基本上删除第二行。

我已经尝试了这个并且它没有工作:

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)

所有这一切的最终目标:

1)仅获得去年与上一年度的百分比变化,并且不显示上一年的NA之类的内容。但如果它是一个新的客户端,我确实希望那里的NA指定它是一个新的客户端。所以这就是为什么我尝试了上面没有用的代码。

2)我想按照MTD中的收入重新排序拆分中的客户:2014年12月。

testing<-ifelse(length(splitresult)>2,splitresult[-2,],splitresult)

(Didn工作:假设splitlist是列表的名称)

如果有人可以帮我解决这两个问题,那将非常有帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

我认为plyr包会对此有所帮助。例如,您可以尝试

,而不是使用ifelse的最后一行代码
library(plyr)
out = ddply(splitresult, "Client", function(x){
  if(dim(x)[1] > 2) x = x[-2,]
  return(x)
})

此处,x是特定于客户端的数据框,out是组合一堆特定于客户端的数据帧的行的结果。

您还可以查看lubridate,这样可以更轻松地处理日期和时间。正如评论中所提到的那样,dplyr也会有所帮助,其余的&#34; Hadleyverse&#34;也是如此。用于清洁和绘制数据的包裹。使用正确的工具,您的问题1和解决方案2的解决方案以及整个清洁和总结过程将变得更加清洁和轻松。