【问题标题】:Reordering a list by element in list and remove specified rows in list按列表中的元素重新排序列表并删除列表中的指定行
【发布时间】:2016-04-12 04:52:53
【问题描述】:

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

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)

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

我想运行以下代码,如果该因素(客户端)的行数大于 2,则该代码实际上将删除第二行。

我已经试过了,但是没有用:

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

所有这些的最终目标:

1) 只获取上一年与上一年的百分比变化,而不显示上一年的 NA 等中间数据。但是,如果它是一个新客户,我确实希望那里的 NA 指定它是一个新客户。所以这就是为什么我尝试了上面没有工作的代码。

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

splitlist[order(sapply(splitlist, function(x) (x[["Revenue"]])))]

(不起作用:假设 splitlist 是列表的名称)

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

【问题讨论】:

  • 您是否尝试过使用dplyr 包?
  • 我没有。我认为我需要在问题的第二部分使用 sapply,但不确定如何处理所涉及的月份/年份。我已经编辑了这个问题,向您展示我尝试过的@Jubbles

标签: r split reorderlist


【解决方案1】:

我认为plyr 包在这里会有所帮助。例如,您可以尝试使用ifelse,而不是使用ifelse 的最后一行代码

library(plyr)
out = ddply(splitresult, "Client", function(x){
  if(dim(x)[1] > 2) x = x[-2,]
  return(x)
})

这里,x 是一个特定于客户端的数据帧,out 是组合一堆特定于客户端的数据帧的行的结果。

您还可以查看lubridate,这将使日期和时间更容易处理。如 cmets 中所述,dplyr 也会有所帮助,用于清理和绘制数据的“Hadleyverse”包的其余部分也是如此。使用正确的工具,您的问题 1 和 2 的解决方案以及整个清洁和总结过程将变得更加清晰和容易。

【讨论】:

  • 谢谢。非常有帮助。我现在唯一需要弄清楚的是,通过 MTD 的收入将其分成不同的数据帧:2015 年。然后就可以开始了。我会在另一篇文章中问这个问题,但如果这是首选的话。 @landau
  • 当然可以。如果您将上面的ddply 更改为dlply,您将在out 中获得特定于客户端的数据框列表,而不是单个数据框。从语义上讲,当您谈论按 MTD: 2015 的收入进行分离时,我不确定您的意思。通常,我会考虑根据日期等特征而不是 2015 年 12 月等级别来分离数据框。
  • 所以当我列出这个列表时,它是由客户按字母顺序排列的。我想按 MTD 12: 2015 的收入订购客户列表
  • 这将按收入列出客户
猜你喜欢
  • 2018-05-08
  • 1970-01-01
  • 2020-11-02
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2021-02-02
  • 2012-02-07
相关资源
最近更新 更多