使用与 R rule() 中零和一的出现顺序相关的多个条件提取行
Extract rows using multiple conditions related to the order of occurrence of zero and one in R rule()
我有一个示例数据集,我想根据与 0 和 1 相关的几个条件提取它。这是示例数据。
df <- data.frame(ID=c(60,60,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,61,61), var=c("X1", "X2","X3", "X4", "X5","X6","X7","X8","X9","X10","X1", "X2","X3", "X4", "X5","X6","X7","X8","X9","X10"),
zero=c(0,0,NA,NA,NA,0,NA,0,NA,NA,NA,NA,NA,0,NA,0,NA,NA,NA,0), pos=c(NA,NA,1,1,NA,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA))
ID
var
zero
pos
60
X1
0
NA
60
X2
0
NA
60
X3
NA
1
60
X4
NA
1
60
X5
NA
NA
60
X6
0
NA
60
X7
NA
1
60
X8
0
NA
60
X9
NA
1
60
X10
NA
NA
61
X1
NA
1
在每个 ID (60,61) 中,我想根据列名 'zero' 和 'pos' 中的变量提取行。第一个条件是,我想提取第一次出现 1 和最后一次出现 1 的行。其次,我想提取在第一次出现 1 之前具有零的行。第三,我想提取零行在第一次出现 1 之后发生。最后,我想用 0 或 1 提取最后一行。
因此,结果 table 看起来像这样。
df2 <- data.frame(ID=c(60,60,60,60,61,61,61,61), var=c("X2","X3","X6","X9","X1", "X4","X9","X10"),
zero=c(0,NA,0,NA,NA,0,NA,0), pos=c(NA,1,NA,1,1,NA,1,NA))
ID
var
zero
pos
60
X2
0
NA
60
X3
NA
1
60
X6
0
NA
60
X9
NA
1
61
X1
NA
1
61
X4
0
NA
61
X9
NA
1
61
X10
0
NA
我尝试使用 rle() 和 match 但我没有成功。
请如果有人熟悉像这样提取数据。我将不胜感激。
提前谢谢你。
您可以创建一个反映您的四个条件的小函数,然后按组应用该函数
f <- function(z,p) {
p1 = which(p==1)
z0 = which(z==0)
c1 = c(p1[1],p1[length(p1)])
c2 = ifelse(z[p1[1]-1]==0, as.integer(p1[1]-1),as.integer(NA))
c3 = min(z0[which(z0>p1[1])], na.rm=T)
c4 = max(p1,z0, na.rm=T)
unique(c(c1,c2,c3,c4))
}
现在,按组应用该功能
libary(dplyr)
df %>%
group_by(ID) %>%
filter(row_number() %in% f(zero,pos))
输出:
ID var zero pos
<dbl> <chr> <dbl> <dbl>
1 60 X2 0 NA
2 60 X3 NA 1
3 60 X6 0 NA
4 60 X9 NA 1
5 61 X1 NA 1
6 61 X4 0 NA
7 61 X9 NA 1
8 61 X10 0 NA
或者,使用 data.table
library(data.table)
setDT(df)[, .SD[f(zero,pos)], by=ID]
输出:
ID var zero pos
<num> <char> <num> <num>
1: 60 X3 NA 1
2: 60 X9 NA 1
3: 60 X2 0 NA
4: 60 X6 0 NA
5: 61 X1 NA 1
6: 61 X9 NA 1
7: 61 X4 0 NA
8: 61 X10 0 NA
我有一个示例数据集,我想根据与 0 和 1 相关的几个条件提取它。这是示例数据。
df <- data.frame(ID=c(60,60,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,61,61), var=c("X1", "X2","X3", "X4", "X5","X6","X7","X8","X9","X10","X1", "X2","X3", "X4", "X5","X6","X7","X8","X9","X10"),
zero=c(0,0,NA,NA,NA,0,NA,0,NA,NA,NA,NA,NA,0,NA,0,NA,NA,NA,0), pos=c(NA,NA,1,1,NA,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA))
ID | var | zero | pos |
---|---|---|---|
60 | X1 | 0 | NA |
60 | X2 | 0 | NA |
60 | X3 | NA | 1 |
60 | X4 | NA | 1 |
60 | X5 | NA | NA |
60 | X6 | 0 | NA |
60 | X7 | NA | 1 |
60 | X8 | 0 | NA |
60 | X9 | NA | 1 |
60 | X10 | NA | NA |
61 | X1 | NA | 1 |
在每个 ID (60,61) 中,我想根据列名 'zero' 和 'pos' 中的变量提取行。第一个条件是,我想提取第一次出现 1 和最后一次出现 1 的行。其次,我想提取在第一次出现 1 之前具有零的行。第三,我想提取零行在第一次出现 1 之后发生。最后,我想用 0 或 1 提取最后一行。
因此,结果 table 看起来像这样。
df2 <- data.frame(ID=c(60,60,60,60,61,61,61,61), var=c("X2","X3","X6","X9","X1", "X4","X9","X10"),
zero=c(0,NA,0,NA,NA,0,NA,0), pos=c(NA,1,NA,1,1,NA,1,NA))
ID | var | zero | pos |
---|---|---|---|
60 | X2 | 0 | NA |
60 | X3 | NA | 1 |
60 | X6 | 0 | NA |
60 | X9 | NA | 1 |
61 | X1 | NA | 1 |
61 | X4 | 0 | NA |
61 | X9 | NA | 1 |
61 | X10 | 0 | NA |
我尝试使用 rle() 和 match 但我没有成功。 请如果有人熟悉像这样提取数据。我将不胜感激。 提前谢谢你。
您可以创建一个反映您的四个条件的小函数,然后按组应用该函数
f <- function(z,p) {
p1 = which(p==1)
z0 = which(z==0)
c1 = c(p1[1],p1[length(p1)])
c2 = ifelse(z[p1[1]-1]==0, as.integer(p1[1]-1),as.integer(NA))
c3 = min(z0[which(z0>p1[1])], na.rm=T)
c4 = max(p1,z0, na.rm=T)
unique(c(c1,c2,c3,c4))
}
现在,按组应用该功能
libary(dplyr)
df %>%
group_by(ID) %>%
filter(row_number() %in% f(zero,pos))
输出:
ID var zero pos
<dbl> <chr> <dbl> <dbl>
1 60 X2 0 NA
2 60 X3 NA 1
3 60 X6 0 NA
4 60 X9 NA 1
5 61 X1 NA 1
6 61 X4 0 NA
7 61 X9 NA 1
8 61 X10 0 NA
或者,使用 data.table
library(data.table)
setDT(df)[, .SD[f(zero,pos)], by=ID]
输出:
ID var zero pos
<num> <char> <num> <num>
1: 60 X3 NA 1
2: 60 X9 NA 1
3: 60 X2 0 NA
4: 60 X6 0 NA
5: 61 X1 NA 1
6: 61 X9 NA 1
7: 61 X4 0 NA
8: 61 X10 0 NA