R;数据框中的最大和最小天数
Posted
技术标签:
【中文标题】R;数据框中的最大和最小天数【英文标题】:R; The number of days maximum and minimum in a dataframe 【发布时间】:2020-05-24 20:56:13 【问题描述】:我有数据框,我想有两个新列 nmaxa 和 nmina 显示列 a 最多多少天,另一列显示列 a 最少多少天。如果它不是最大值或最小值,则天数将为 0。最大值或最小值的回溯天数可能非常大。我试图在 R 中找到一个回溯函数来做到这一点,但我找不到。
set.seed(123)
days = 1:100
a = runif(100, 1, 100)
df <- data.frame(days,a)
head(df)
tail(df)
示例: 如果列 a 的值大于前 2 天但小于前 3 天,则返回值为 2。
如果列 a 的值小于前 3 天但大于前 4 天,则返回值为 3。
这是一个具体示例,但我需要它回溯到不再满足最大或最小条件(执行 while 条件循环)并返回最大值和最小值的天数。
我将不胜感激。
【问题讨论】:
谢谢。我已经编辑了这篇文章,以更清楚地说明我需要做什么。这是一个玩具示例,但最小值和最大值的可变回溯期可能非常大 你能检查一下这个逻辑head(df) %>% mutate(a1 = lag(a, default = first(a)), a2 = lag(a, 2, default = first(a)), new = a > a1 & a > a2 & a < lag(a, 3, default = first(a)))
或者它是rollapply
的滚动函数
示例中是否需要b列?
对于上述具体示例,这是一个非常优雅的解决方案,但我需要它回溯到不再满足最大或最小条件。
【参考方案1】:
另一个data.table
选项使用带有mult=
参数的自联接:
df[, nmaxa := .SD[.SD, on=.(days<days, a>=a), mult="last",
i.days - fcoalesce(x.days, 0L) - 1L]
]
df[, nmina := .SD[.SD, on=.(days<days, a<=a), mult="last",
i.days - fcoalesce(x.days, 0L) - 1L]
]
head(df, 18L)
的输出:
days a nmaxa nmina
1: 1 29.470174 0 0
2: 2 79.042208 1 0
3: 3 41.488715 0 1
4: 4 88.418723 3 0
5: 5 94.106261 4 0
6: 6 5.510093 0 5
7: 7 53.282443 1 0
8: 8 89.349485 2 0
9: 9 55.592066 0 1
10: 10 46.204859 0 3
11: 11 95.726501 10 0
12: 12 45.880081 0 5
13: 13 68.079493 1 0
14: 14 57.690707 0 1
15: 15 11.189544 0 8
16: 16 90.082672 4 0
17: 17 25.362686 0 1
18: 18 5.163894 0 17
【讨论】:
【参考方案2】:这可能行得通
library(data.table)
setDT(df)[, Max := (Reduce(`&`, lapply(shift(a, n = 1:2,
fill = first(a)), `<`, a)) & a < shift(a, n = 3, fill = first(a))) * 2]
df[, Min := (Reduce(`&`, lapply(shift(a, n = 1:3,
fill = first(a)), `>`, a)) & a > shift(a, n = 4, fill = first(a))) * 3]
【讨论】:
@MacOS 除shift
部分外,其他所有功能均来自base R
。因此,使用embed
更容易构建班次以上是关于R;数据框中的最大和最小天数的主要内容,如果未能解决你的问题,请参考以下文章