答案 0 :(得分:3)
在最后的注释中使用DF
可重复定义,我们可以使用rollapply
应用max
获取所有先前值的最大值,其中指定宽度list(-seq(.N))
到rollapply
表示使用偏移-1,-2,..., - 。N。 partial=TRUE
表示即使某些偏移量不可用,也要使用指定偏移量中可用的任意数量的值。最后使用by=
在每个组上运行它。
此解决方案根据要求使用rollapply
和data.table,并涉及直接指定要使用哪些偏移而不是移位或滞后。
如果我们需要,我们可以将max
更改为min
,sum
,mean
,median
或其他任何合适的内容。如果我们想要将其更改为只找到前一个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
- 包以及cummax
和shift
函数的可能解决方案:
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
,结果会向上移动一个位置,因为n
,type
&amp;的默认值fill
参数分别为1L
,lag
和NA
,写完为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>