首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:窗口函数

R:窗口函数
EN

Stack Overflow用户
提问于 2015-07-23 05:11:43
回答 3查看 357关注 0票数 3

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

代码语言:javascript
复制
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中。

我需要获得如上所示的输出。输出应如下所示:

代码语言:javascript
复制
Month   Year
4   2015
EN

回答 3

Stack Overflow用户

发布于 2015-07-23 06:11:09

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

代码语言:javascript
复制
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,我们将按每个组检查,如果大于2,则选择该组中的第一个实例。

一个更短的版本(由@Arun提议)将是

代码语言:javascript
复制
setDT(df)[, if(Default && .N > 2L) .SD[1L], by = .(indx = rleid(Default), Default)]
票数 2
EN

Stack Overflow用户

发布于 2015-07-23 05:31:59

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

编辑

现在有了代码:

代码语言:javascript
复制
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")
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-23 07:05:46

尽管data.table是一个非常好的包,但是在base R中使用rle可以做到这一点,而不需要data.table!但有时人们只是想使用base R而不需要其他依赖项。

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31574057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档