首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >回传姓名

回传姓名
EN

Stack Overflow用户
提问于 2018-06-01 13:46:40
回答 3查看 47关注 0票数 2

我的df看起来是这样的:

我想得到所有的名字,其中至少有两个连续出现1。

在这种情况下,我只想回到B,C,D,F。

有办法这样做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-01 14:00:09

通过使用lag,这只适用于连续的2次,如果需要增加限制,可以检查akrun's answer

代码语言:javascript
运行
复制
s=df$Name[apply(df[,c(2:6)],1,function(x) any((lag(x)==x)&x==1))]
s[!is.na(s)]
[1] "B" "C" "D" "F"
票数 3
EN

Stack Overflow用户

发布于 2018-06-01 13:51:01

我们可以循环遍历行,使用rle (查找是否有连续的元素)并创建一个逻辑索引来子集“名称”

代码语言:javascript
运行
复制
df1$Name[apply(df1[-1], 1, function(x) {
                 rl <- rle(x==1)
            any(rl$lengths[rl$values]>=2)})]
#[1] "B" "C" "D" "F"

一种更快速的方法可能是对每一行中的元素进行paste,然后使用regex查找来查找1后面是否有1

代码语言:javascript
运行
复制
df1$Name[grepl("(?<=1)1", do.call(paste0, df1[-1]), perl = TRUE)]
#[1] "B" "C" "D" "F"

数据

代码语言:javascript
运行
复制
df1 <- structure(list(Name = c("A", "B", "C", "D", "E", "F"), `2000` = c(1L, 
0L, 1L, 1L, 0L, 0L), `2001` = c(0L, 0L, 1L, 1L, 1L, 1L), `2002` = c(0L, 
1L, 0L, 1L, 0L, 0L), `2003` = c(1L, 1L, 0L, 1L, 1L, 1L), `2004` = c(0L, 
0L, 1L, 1L, 0L, 1L), `2005` = c(1L, 1L, 1L, 0L, 1L, 1L)), .Names = c("Name", 
"2000", "2001", "2002", "2003", "2004", "2005"), class = "data.frame", 
 row.names = c(NA, -6L))
票数 5
EN

Stack Overflow用户

发布于 2018-06-01 15:01:23

使用zoo::rollapply的选项:

代码语言:javascript
运行
复制
library(zoo)

#One can increase the n for 3, 4 etc consecutive values
# For consecutive 2 values
n =2
df1[apply(df1[-1], 1, function(x)
  length(which(rollapply(x, width=n, function(x)all(x==rep(1,n)), align = "left")))>0),1]

#[1] "B" "C" "D" "F"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50644876

复制
相关文章

相似问题

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