【问题标题】:R: Window functionR:窗口函数
【发布时间】:2015-10-12 23:21:39
【问题描述】:

我有一个数据框DF,三列n行如下所示:

Month Year  Default
1   2015    T
2   2015    T
3   2015    F
4   2015    T
5   2015    T
6   2015    T
7   2015    F

我想检查一卷是否有 3 个 T 并继续,然后将所有开始的年份和月份打印到一个新的 DF 中。

我需要得到如上所示的输出。输出应该是:

Month   Year
4   2015

【问题讨论】:

  • rle 可能会成为你的朋友

标签: r window-functions sliding-window


【解决方案1】:

这可能不是最好的解决方案,但我的第一次尝试是 - 将第三列粘贴到一个字符串中 - 使用正则表达式查找该字符串中所有出现的“TTT”,这将为您提供一个向量。 - 使用此向量逐行对原始数据帧进行子集化,省略最后一列

编辑

现在有代码:

def_str <- paste(as.integer(DF$default), collapse="")
indices <- unlist(gregexp("111+", def_str))
if (!indices[1]==-1){
  # if there is no match, indices will be -1
  DF[indices,-3]
}
else {
  print("someting dramatic about no 3 months rolling T's")
}

【讨论】:

  • 这是一个非常好的主意,但我们通常会用包含代码的解决方案来回答
  • 我只是想发表评论,但我不允许!所以我不得不写一个答案。我确信这个特定的 stackoverflow 规则有充分的理由,但我没有看到它......
【解决方案2】:

这里尝试使用data.table devel version on GH 和新的rleid 函数

library(data.table) # v 1.9.5+
setDT(df)[, indx := rleid(Default)]
df[(Default), if(.N > 2) .SD[1L], by = indx]
#    indx Month Year Default
# 1:    3     4 2015    TRUE

我们在这里所做的基本上是为Default 中的每个连续事件设置一个唯一索引,然后仅在Default == TRUE 时查看每个组的大小是否大于2,如果是这样,选择该组中的第一个实例。


一个较短的版本(由@Arun 提出)是

setDT(df)[, if(Default && .N > 2L) .SD[1L], by = .(indx = rleid(Default), Default)]

【讨论】:

  • 另一种方式:setDT(df)[, if (Default &amp;&amp; .N &gt; 2L) .SD[1L], by = .(indx = rleid(Default), Default)]
  • @Arun 哦,这是我最初的想法,但无法弄清楚如何让Default 进入那里,它一直返回错误,因为它找不到Default(没想到也将其添加到by 语句中)
【解决方案3】:

一种在没有 data.table 的情况下在 base R 中使用 rle 的方法,尽管 data.table 是一个非常好的包!但有时人们只想使用基本 R 而不需要其他依赖项。

dt <- data.frame(Month = c(1, 2, 3, 4, 5, 6, 7), Year = 2015, Default = c(T, T, F, T, T, T, F))

runData <- rle(dt$Default)

whichThree <- which(runData$lengths == 3 & runData$values)

idx <- unlist(lapply(whichThree - 1, function(x) sum(runData$lengths[1:x])))
idx <- idx + 1

dt[idx, 1:2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多