只需删除第一列和最后一列,使用& 创建一个逻辑矩阵,然后使用rowSums 创建子集的逻辑向量
df[rowSums(df[-1] & df[-ncol(df)]) > 0,]
-输出
0m-10m 0m-15m 0m-20m 0m-25m
X 1 0 1 1
Y 1 1 0 0
上面的rowSums不是基于单一数据的。我们通过删除第一列和最后一列然后使用&,从两个大小相等的数据集创建一个逻辑矩阵,因此,如果两者在同一位置都有1,则只有它会返回TRUE,否则返回FALSE。此矩阵上的rowSums 返回 TRUE(或 TRUE/FALSE -> 1/0)的总和
> df[-1] & df[-ncol(df)]
0m-15m 0m-20m 0m-25m
X FALSE FALSE TRUE
Y TRUE FALSE FALSE
Z FALSE FALSE FALSE
> rowSums(df[-1] & df[-ncol(df)])
X Y Z
1 1 0
> rowSums(df[-1] & df[-ncol(df)]) > 0
X Y Z
TRUE TRUE FALSE
或者,如果我们正在寻找一般情况,我们可以使用rle - 通过循环使用apply 和MARGIN = 1 对每一行进行运行长度编码。 rle 为每个相邻的相似值返回 list 的 values 和 lengths。然后,我们根据lengths 和values 创建一个逻辑向量,即如果“values”为 1,“lengths”为 2。
n <- 2
df[apply(df, 1, FUN = function(x) with(rle(x), any(lengths == n & values))),]
0m-10m 0m-15m 0m-20m 0m-25m
X 1 0 1 1
Y 1 1 0 0
-代码分解
> apply(df, 1, FUN = rle)
$X
Run Length Encoding
lengths: Named int [1:3] 1 1 2
- attr(*, "names")= chr [1:3] "0m-15m" "0m-20m" ""
values : Named int [1:3] 1 0 1
- attr(*, "names")= chr [1:3] "0m-10m" "0m-15m" "0m-25m"
$Y
Run Length Encoding
lengths: Named int [1:2] 2 2
- attr(*, "names")= chr [1:2] "0m-20m" ""
values : Named int [1:2] 1 0
- attr(*, "names")= chr [1:2] "0m-15m" "0m-25m"
$Z
Run Length Encoding
lengths: Named int [1:4] 1 1 1 1
- attr(*, "names")= chr [1:4] "0m-15m" "0m-20m" "0m-25m" ""
values : Named int [1:4] 0 1 0 1
- attr(*, "names")= chr [1:4] "0m-10m" "0m-15m" "0m-20m" "0m-25m"
> apply(df, 1, FUN = function(x) with(rle(x),lengths == n & values))
$X
0m-15m 0m-20m
FALSE FALSE TRUE
$Y
0m-20m
TRUE FALSE
$Z
0m-15m 0m-20m 0m-25m
FALSE FALSE FALSE FALSE
> apply(df, 1, FUN = function(x) with(rle(x), any(lengths == n & values)))
X Y Z
TRUE TRUE FALSE