Расширение информационного кадра с условием - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы расширить фрейм данных с дубликатами его собственных элементов, но с конкретными условиями.

Вот мои примеры данных:

x1 <- c(1, 2, 3, 4, 5)
x2 <- c(2, 2, 2, 2, 2)
y1 <- c(9, 9, 8, 9, 9)
y2 <- c(0, 0, 0, 1, 1)

df <- data.frame(x1, x2, y1, y2)
df   

  x1 x2 y1 y2
1  1  2  9  0
2  2  2  9  0
3  3  2  8  0
4  4  2  9  1
5  5  2  9  1

Условие: дублировать, только если y1= 9 и y2 = 0. Поэтому выходные данные должны выглядеть следующим образом:

  x1 x2 y1 y2
1  1  2  9  0
2  2  2  9  0
3  3  2  8  0
4  4  2  9  1
5  5  2  9  1
6  1  2  9  0
7  2  2  9  0

Случаи 1 и 2 были продублированы, и соответственно кадр данных был расширен (новые строки 6 и 7).Случаи 3, 4 и 5 были проигнорированы, условие не было выполнено.

Я благодарен за любую помощь.

1 Ответ

0 голосов
/ 12 октября 2018

Мы можем получить индекс строк, который удовлетворяет нашему условию, используя which и просто rbind эти строки вместе в исходном фрейме данных.

inds <- which(df$y1 == 9 & df$y2 == 0)
rbind(df, df[inds,])

#  x1 x2 y1 y2
#1  1  2  9  0
#2  2  2  9  0
#3  3  2  8  0
#4  4  2  9  1
#5  5  2  9  1
#6  1  2  9  0
#7  2  2  9  0

Или используя dplyr bind_rows

library(dplyr)

bind_rows(df, 
df %>%
  filter(y1 == 9 & y2 == 0))

Если мы хотим изменить значения для дублированных строк для y1 на 10, мы можем сделать

bind_rows(df, 
          df %>%
            filter(y1 == 9 & y2 == 0) %>% 
            mutate(y1 = 10)
          )

#  x1 x2 y1 y2
#1  1  2  9  0
#2  2  2  9  0
#3  3  2  8  0
#4  4  2  9  1
#5  5  2  9  1
#6  1  2 10  0
#7  2  2 10  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...