Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在连续行中查找值_R_For Loop_If Statement - Fatal编程技术网

R 在连续行中查找值

R 在连续行中查找值,r,for-loop,if-statement,R,For Loop,If Statement,下面给出了我使用的数据帧的一个示例 ID X 1 1 2 2 3 1 4 0 5 0 6 1 7 4 8 5 9 6 10 7 11 0 12 0 我想对它应用逻辑,查看3个或更多连续行中的值是否大于0。如果有,我想在另一列中标记它们。因此,输出将如下所示 ID X Y

下面给出了我使用的数据帧的一个示例

ID     X      
1      1     
2      2      
3      1      
4      0      
5      0      
6      1      
7      4
8      5 
9      6
10     7
11     0 
12     0
我想对它应用逻辑,查看3个或更多连续行中的值是否大于0。如果有,我想在另一列中标记它们。因此,输出将如下所示

ID     X      Y
1      1      1
2      2      1
3      1      1
4      0      0
5      0      0
6      1      1
7      4      1
8      5      1
9      6      1
10     7      1
11     0      0
12     0      0
扩展- 我如何获得以下输出,为每组赋予不同的Y值

ID     X      Y
1      1      1
2      2      1
3      1      1
4      0      0
5      0      0
6      1      2
7      4      2
8      5      2
9      6      2
10     7      2
11     0      0
12     0      0

带有
基本R
的一个选项。使用
rle
查找“X”中大于0的相邻值,然后根据
长度执行
rep
应用

df1$Y <- with(rle(df1$X > 0), as.integer(rep(values & lengths > 2, lengths)))
df1$Y
#[1] 1 1 1 0 0 1 1 1 1 1 0 0
数据
df1我们可以从
data.table
中使用
rleid
创建组,并在
ave
中使用它,获得每个组的
length
,并将1分配给长度大于3的组

library(data.table)
df$Y <- as.integer(ave(df$X, rleid(df$X > 0), FUN = length) >= 3)

df
#   ID X Y
#1   1 1 1
#2   2 2 1
#3   3 1 1
#4   4 0 0
#5   5 0 0
#6   6 1 1
#7   7 4 1
#8   8 5 1
#9   9 6 1
#10 10 7 1
#11 11 0 0
#12 12 0 0

为什么不使用纯
data.table
df[,Y:=as.integer(.N>=3L),by=rleid(X>0)]
@snoram谢谢,我不是真的使用
数据。table
所以我不太了解语法,但是
数据中的某些函数。table
非常方便,就像
rleid
,因此首选
ave
library(data.table)
setDT(df1)[, Y := as.integer((.N > 2) * (X > 0)),rleid(X > 0)]
df1 <- structure(list(ID = 1:12, X = c(1L, 2L, 1L, 0L, 0L, 1L, 4L, 5L, 
 6L, 7L, 0L, 0L)), class = "data.frame", row.names = c(NA, -12L
 ))
library(data.table)
df$Y <- as.integer(ave(df$X, rleid(df$X > 0), FUN = length) >= 3)

df
#   ID X Y
#1   1 1 1
#2   2 2 1
#3   3 1 1
#4   4 0 0
#5   5 0 0
#6   6 1 1
#7   7 4 1
#8   8 5 1
#9   9 6 1
#10 10 7 1
#11 11 0 0
#12 12 0 0
library(dplyr)
library(data.table)

df %>%
  group_by(group = rleid(X > 0)) %>%
  mutate(Y = ifelse(n() >= 3 & row_number() == 1, 1, 0)) %>%
  ungroup() %>%
  mutate(Y = cumsum(Y) * Y) %>%
  group_by(group) %>%
  mutate(Y = first(Y)) %>%
  ungroup() %>%
  select(-group)


#     ID     X     Y
#   <int> <int> <dbl>
# 1     1     1     1
# 2     2     2     1
# 3     3     1     1
# 4     4     0     0
# 5     5     0     0
# 6     6     1     2
# 7     7     4     2
# 8     8     5     2
# 9     9     6     2
#10    10     7     2
#11    11     0     0
#12    12     0     0