В кадре данных я хочу дублировать строки с определенным условием в другом столбце - PullRequest
0 голосов
/ 22 января 2020

Я хочу продублировать все строки с обработкой C 3 раза. Как мне это сделать?

A <- sample(1:100,9)
B <- sample(1:100,9)
trt <- rep(c("A", "B", "C"),3) 

df <- data.frame(trt, A, B)
> df
  trt  A  B
1   A 82 57
2   B 76  2
3   C 12 82
4   A 87 25
5   B 64 86
6   C 74 89
7   A  4 80
8   B 31 13
9   C 39 88

Я пробовал это, но это не получается!

as.data.frame(lapply(df, rep, 2))

if (df[df$trt=="C",]){
  data.frame(rep(df,3))
  }

Ответы [ 2 ]

1 голос
/ 22 января 2020

Rusti c но эффективно, просто подмножество и rbind

rbind(df, df[trt =="C",], df[trt =="C",])

Здесь это просто объединение исходного data.frame и двух подмножеств, которые содержат только строки, где trt равно C.

1 голос
/ 22 января 2020

Мы можем получить номера строк, когда trt == C, а затем использовать rep, чтобы повторить их

inds <- which(df$trt == "C")
df[sort(c(1:nrow(df), rep(inds, 2))), ]

#    trt  A  B
#1     A 34 58
#2     B  2 11
#3     C 57 67
#3.1   C 57 67
#3.2   C 57 67
#4     A 77 99
#5     B 37 70
#6     C 93 46
#6.1   C 93 46
#6.2   C 93 46
#7     A 61 17
#8     B 24  1
#9     C 16 54
#9.1   C 16 54
#9.2   C 16 54

Другая концепция может состоять в filter строках, где trt == "C", повторять их и привязать к строкам где trt != "C". Используя dplyr, мы можем реализовать его как

library(dplyr)
df %>%
  filter(trt == "C") %>%
  slice(rep(row_number(), 3)) %>%
  bind_rows(df %>% filter(trt != "C"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...