Повторите строки с определенным значением

#r #dplyr

Вопрос:

Я хотел бы повторить, что строки содержат определенные значения в R, df как показано ниже

 df <- data.frame(name1 = c("x","y","z"),
                 name2 = c(0,1,2))
df

  name1 name2
1     x     0
2     y     1
3     z     2
 

Мой желаемый результат

   name1 name2
1     x     0
2     x     0
3     y     1
4     y     1
5     z     2
 

Я хотел бы сказать, что только строки, содержащие » x » и «y», будут повторяться один раз.
До сих пор мне приходила в голову только идея использовать add_row и заменять NA значения соответствующими значениями. Есть какие-нибудь рекомендации по этому использованию tidyverse ?

Ответ №1:

Мы могли бы сделать это таким образом:

 library(dplyr)
df %>% 
  filter(name1=="x" | name1=="y") %>% 
  bind_rows(df) %>% 
  arrange(name1)

 
   name1 name2
1     x     0
2     x     0
3     y     1
4     y     1
5     z     2
 

Комментарии:

1. а что, если у нас будет больше строк, чем это? Я уже отредактировал свой вопрос, братан

2. Он также работает с новым df!

3. моя вина. Способ, который вы здесь делаете, заключается в том, чтобы связать строку с df уже существующей. Что делать, если df здесь в трубе, то я хотел бы сделать этот шаг в потоке.

Ответ №2:

Мы также можем сделать это следующим образом

 library(dplyr)
library(tidyr)
df %>%  
   uncount(1  (name1 %in% c('x', 'y')))
  name1 name2
1     x     0
2     x     0
3     y     1
4     y     1
5     z     2
 

Ответ №3:

Я просто не мог вспомнить, но я думал, что есть более короткий способ сделать это:

 df[sort(c(seq_len(nrow(df)), rep(which(df$name1 %in% c("x", "y")), 1))),]

    name1 name2
1       x     0
1.1     x     0
2       y     1
2.1     y     1
3       z     2
 

Ответ №4:

Вы можете создать новый столбец, указав, сколько раз строка должна повторяться, а затем использовать uncount их для повторения.

 library(dplyr)
library(tidyr)

df %>%
  mutate(repeat_row = ifelse(name1 %in% c('x', 'y'), 2, 1)) %>%
  uncount(repeat_row)

#  name1 name2
#1     x     0
#2     x     0
#3     y     1
#4     y     1
#5     z     2
 

Ответ №5:

Вы можете сделать это с помощью tidyr::add_row , но опишите, что вы хотите поместить в строку с помощью индексации.

 library(tidyverse)
df <- data.frame(name1 = c("x","y","z"),
                 name2 = c(0,1,2))
df %>% 
  add_row(df[1,], .before = 2) %>% 
  add_row(df[2,], .before = 3)
 

Комментарии:

1. то же самое с моей стороны, я также использую только add_row