#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