R中的动力学“rollapply”

时间:2018-04-01 14:10:18

标签: r data.table rollapply

我想在R中按组(但不包括当前行)获得最多(N-1)行。不确定我应该如何开始,因为每个组都有动态行数。例如:

Example of what I want

谢谢=)

3 个答案:

答案 0 :(得分:3)

在最后的注释中使用DF可重复定义,我们可以使用rollapply应用max获取所有先前值的最大值,其中指定宽度list(-seq(.N))rollapply表示使用偏移-1,-2,..., - 。N。 partial=TRUE表示即使某些偏移量不可用,也要使用指定偏移量中可用的任意数量的值。最后使用by=在每个组上运行它。

此解决方案根据要求使用rollapply和data.table,并涉及直接指定要使用哪些偏移而不是移位或滞后。

如果我们需要,我们可以将max更改为minsummeanmedian或其他任何合适的内容。如果我们想要将其更改为只找到前一个k值的最大值,那么我们可以将-seq(.N)替换为-seq(k)

library(data.table)
library(zoo)

DT <- as.data.table(DF)
DT[, max := rollapply(Count, list(-seq(.N)), max, partial = TRUE, fill = NA), by = Group]

,并提供:

> DT
   Group Count max
1:     A    23  NA
2:     A    12  23
3:     A   145  23
4:     B   123  NA
5:     B    34 123
6:     B   456 123
7:     B   555 456

注意

可重现形式的输入DF是:

DF <- data.frame(Group = c("A", "A", "A", "B", "B", "B", "B"),
                 Count = c(23, 12, 145, 123, 34, 456, 555))

更新

修复原始版本并使用较短的解决方案更新它,并使用data.table根据问题的data.table标记进行更新。

答案 1 :(得分:3)

使用data.table - 包以及cummaxshift函数的可能解决方案:

library(data.table)
setDT(df)[, lagged_max := shift(cummax(Count)), by = Group][]

给出:

> df
   Group Count lagged_max
1:     A    23         NA
2:     A    12         23
3:     A   145         23
4:     B   123         NA
5:     B    34        123
6:     B   456        123
7:     B   555        456

这是做什么的:

  • setDT(df)会将数据框df转换为data.table
  • cummax(Count)获得累计最高值Count
  • 使用shift,结果会向上移动一个位置,因为ntype&amp;的默认值fill参数分别为1LlagNA,写完为shift(cummax(Count), n = 1L, type = 'lag', fill = NA)

基础R中的逻辑相同:

transform(df, lagged_max = ave(Count, Group, FUN = function(x) c(NA, head(cummax(x), -1))))

dplyr

library(dplyr)
df %>% 
  group_by(Group) %>% 
  mutate(lagged_max = lag(cummax(Count)))

使用过的数据:

df <- data.frame(Group = c("A", "A", "A", "B", "B", "B", "B"),
                 Count = c(23, 12, 145, 123, 34, 456, 555))

答案 2 :(得分:1)

以下是使用# Sample data df <- data.frame( Group = c("A", "A", "A", "B", "B", "B", "B"), Count = c(23, 12, 145, 123, 34, 456, 555)) library(tidyverse); df %>% group_by(Group) %>% mutate( n1 = lag(Count, 1), n2 = lag(Count, 2), max = ifelse(!is.na(n2) & !is.na(n1) & n2 > n1, n2, n1)) %>% select(-n1, -n2) ## A tibble: 7 x 3 ## Groups: Group [2] # Group Count max # <fct> <dbl> <dbl> #1 A 23. NA #2 A 12. 23. #3 A 145. 23. #4 B 123. NA #5 B 34. 123. #6 B 456. 123. #7 B 555. 456. 的解决方案:

<table style="width:100%" id="ex-table">
        <th>Image</th>
        <th>Name</th>
        <th>Price</th>
        <th>Category</th>
        <th>Description</th>
    <script>
    var fbRef = firebase.database().ref().child("Sell_Products");
fbRef.on("child_added", snap => {
    var name = snap.child("name").val();
    var price = snap.child("price").val();
    var category = snap.child("category").val();
    var description = snap.child("description").val();
    var image = snap.child("image").val();
    $("#ex-table").append("<tr><td><a href='auction.html'><img src=" + image + "/img></a></td><td>" + name + "</td><td>" + price + "</td><td>" + category + "</td><td>" + description + "</td></tr>" );
});
</script>
</table>