Я ищу лучший способ добиться того, что код ниже делает с циклом for
. Цель состоит в том, чтобы создать фрейм данных (или матрицу), где каждая строка представляет собой возможную последовательность n
с длиной 1
с и 0
с, за которой следует столбец n+1
, который содержит число, соответствующее одному из предыдущие столбцы, содержащие 0
.
Так, например, в случае n == 3
мы хотим включить строку, подобную этой:
1 0 0 2
но не это:
1 0 0 1
Вот код, который у меня сейчас есть (для простоты предполагается n == 3
):
library(tidyverse)
df <- expand.grid(x = 0:1, y = 0:1, z = 0:1, target = 1:3, keep = FALSE)
for (row in 1:nrow(df)) {
df$keep[row] <- df[row, df$target[row]] == 0
}
df <- df %>%
filter(keep == TRUE) %>%
select(-keep)
head(df)
# x y z target
# 1 0 0 0 1
# 2 0 1 0 1
# 3 0 0 1 1
# 4 0 1 1 1
# 5 0 0 0 2
# 6 1 0 0 2
# 7 0 0 1 2
# 8 1 0 1 2
# 9 0 0 0 3
# 10 1 0 0 3
# 11 0 1 0 3
# 12 1 1 0 3
Похоже, должен быть лучший способ сделать это, особенно с dplyr
. Но я не могу понять, как использовать значение target
для указания столбца на filter
on.