R 报出姓名

R 报出姓名,r,dataframe,R,Dataframe,我有一个df,看起来像这样: 我想得到所有的名字,其中至少有2个连续出现的1 在这种情况下,我只想拿回B C D F 有没有办法做到这一点?我们可以在行中循环,使用rle(查找是否有连续的元素)并创建一个逻辑索引来子集“名称” df1$Name[apply(df1[-1], 1, function(x) { rl <- rle(x==1) any(rl$lengths[rl$values]>=2)})] #[1] "B" "C

我有一个df,看起来像这样:

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

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


有没有办法做到这一点?

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

df1$Name[apply(df1[-1], 1, function(x) {
                 rl <- rle(x==1)
            any(rl$lengths[rl$values]>=2)})]
#[1] "B" "C" "D" "F"
数据
df1通过使用
lag
,这只适用于连续2次,如果您需要增加限制,您可以检查


使用
zoo::rollapply
的选项:

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"

@bli12blu12 yw:-)顺便说一句,这是很棒的修改:-)祝您编码愉快,或者可能
df1$Name[!!colSums(rollappy(t(unname(df1[-1])),2,相同,rep(1L,2))]
@G.Grothendieck非常感谢您指出这一点。事实上,在添加我的答案时,我想不起如何命名。因此,我放弃了使用相同的
的想法。
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))
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"
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"