【问题标题】:R - Identify -n rows before and after a flag *by group*R - 识别标志前后的-n行*按组*
【发布时间】:2021-02-23 02:50:51
【问题描述】:

我很难在一个标志之前和之后隔离 n 行按组

我在其他地方找到了一个可行的答案,但被小于行范围的组抛弃了。例如,如果范围是 6 行,但一个组只有五个观察值,则查询将开始包括来自先前组的不相关观察值。

这里有一些要重现的虚拟数据。

x <- c("", "", "", "1", "", "","", "", "", "", "", "1","", "", "", "", "1", "")
y <- c("2", "6", "4", "4", "7", "9","1", "15", "7", "4", "5", "8","6", "1", "2", "4", "6", "16")
z <- c("a", "a", "a", "a", "a", "a","a", "b", "b", "b", "b", "b","b", "b", "c", "c", "c", "c")

a <- as.data.frame(cbind(x, y, z))

  x  y z
1     2 a
2     6 a
3     4 a
4  1  4 a
5     7 a
6     9 a
7     1 a
8    15 b
9     7 b
10    4 b
11    5 b
12 1  8 b
13    6 b
14    1 b
15    2 c
16    4 c
17 1  6 c
18   16 c

理想情况下,我希望a 看起来像这样:

  x  y z
1     6 a
2     4 a
3  1  4 a
4     7 a
5     9 a
6     1 a
7     4 b
8     5 b
9  1  8 b
10    6 b
11    1 b
12    2 c
13    4 c
14 1  6 c
15   16 c

【问题讨论】:

  • 您能解释一下您希望如何在输出中创建x 列的逻辑吗?

标签: r dataframe subset rows


【解决方案1】:
a[zoo::rollapply(a$x, 5, function(z) "1" %in% z, partial = TRUE),]
#    x  y z
# 2     6 a
# 3     4 a
# 4  1  4 a
# 5     7 a
# 6     9 a
# 10    4 b
# 11    5 b
# 12 1  8 b
# 13    6 b
# 14    1 b
# 15    2 c
# 16    4 c
# 17 1  6 c
# 18   16 c

zoo::rollapply 一次在数字的“窗口”上运行。这里是 5,这意味着它查看五个值并返回一个值;然后移动一个(四个相同,再加一个),并返回一个值;等等

因为我指定了partial=TRUE(当您需要输出长度与输入长度相同时是必需的),所以查看的值的长度可能与kernel 宽度不同(5)。

关键是,如果我一次查看五个,如果其中一个是 "1",那么我们在 "1" 的两行内,应该保留。

窗口的一个重要属性是alignment,这里默认是center。它定义了结果在窗口中的位置。

在这种情况下,窗口看起来像:

#  [1] ""  ""  ""  "1" ""  ""  ""  ""  ""  ""  ""  "1" ""  ""  ""  ""  "1" "" 
1:     nn-------' (partial match)
2:     ----yy--------' (partial)
3:     `-------yy-------'  there is a window in this set of five, so a true ("yy")
4:         `-------yy-------'
5:             `-------yy-------'
6:                 `-------yy-------'
7:                     `-------nn-------' no "1", so a false
... etc
#  [1] ""  ""  ""  "1" ""  ""  ""  ""  ""  ""  ""  "1" ""  ""  ""  ""  "1" "" 

您可以在前七个窗口中看到第一个被丢弃(没有足够接近的"1"),我们有五个是真的("yy" 在我的命名中),然后我们得到一个假的(@987654332 @ 因为它没有看到 "1"

【讨论】:

  • 这真的很有帮助! partial = true 很有意义。
  • 我的一个问题与中心有关 > 假设我的宽度是偶数,例如 6。现在它说“中心”是第 4 个观察值,但如果是第三次观察。有没有办法做到这一点?我正在尝试阅读文档,但找不到太多内容。
  • NVM @r2evans 在这里找到了答案:stackoverflow.com/a/32235049/4846798
  • 有两种选择,而不仅仅是一种,可以使输出与输入的长度相同:使用 partial=TRUE 或 fill=NA。
  • Hrmmm...是的,抱歉@r2evans 它看起来不像现在这样工作。我进一步查看了我的数据集,看起来该函数仍在“到达”另一个组以获取行来填充窗口。
猜你喜欢
  • 2014-07-11
  • 2014-07-24
  • 1970-01-01
  • 2020-04-26
  • 2021-11-16
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多