Фильтрация по столбцу, номер которого указан в другом столбце - PullRequest
0 голосов
/ 09 июля 2019

Я ищу лучший способ добиться того, что код ниже делает с циклом 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.

1 Ответ

1 голос
/ 09 июля 2019

Используя базу R, мы можем создать индекс строки / столбца для фильтрации значений из кадра данных и сохранять строки, в которых извлеченное значение равно 0.

df[df[cbind(seq_len(nrow(df)), df$target)] == 0, ]

#   x y z target
#1  0 0 0      1
#3  0 1 0      1
#5  0 0 1      1
#7  0 1 1      1
#9  0 0 0      2
#10 1 0 0      2
#13 0 0 1      2
#14 1 0 1      2
#17 0 0 0      3
#18 1 0 0      3
#19 0 1 0      3
#20 1 1 0      3

data

df <- expand.grid(x = 0:1, y = 0:1, z = 0:1, target = 1:3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...