R - объединить строки из одного кадра данных в другой после каждого «n» -го ряда - PullRequest
0 голосов
/ 27 февраля 2019

Рассмотрим 2 кадра данных с одинаковыми именами столбцов и одинаковыми значениями первого столбца.

df1 <- data.frame(col1 = rep(c("x", "y", "z"),4),
                col2 = as.factor(sample(12)),
                col3 = sample(c(TRUE, FALSE), 12, replace = TRUE))
df2 <- data.frame(col1 = rep(c("x", "y", "z"),4),
                col2 = as.factor(sample(12)),
                col3 = sample(c(TRUE, FALSE), 12, replace = TRUE))

Я хочу вставить строки 1-3 из 1-го кадра данных после строки 3 в другой кадр данных, строки 4-6 после строки6, ряды 7-9 после ряда 9 и так далее.Функции rbind и bind_row, похоже, не имеют аргументов, поддерживающих такую ​​операцию.

Любая помощь о том, как это сделать, приветствуется.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Разделение фреймов данных и их рекомбинация в соответствии с последовательностью из 3-х может достичь ваших целей:

df1_split <- split(df1, rep(1:(nrow(df1)/3), each = 3))
df2_split <- split(df2, rep(1:(nrow(df1)/3), each = 3))
r1 <- do.call(rbind, lapply(seq_along(df1_split), function(i) rbind(df2_split[[i]], df1_split[[i]])))

#    col1 col2  col3
#1      x    9  TRUE
#2      y   10 FALSE
#3      z    4  TRUE
#4      x   12  TRUE
#5      y    9 FALSE
#6      z    8 FALSE
#42     x   12 FALSE
#52     y    1 FALSE
#62     z    2  TRUE
#41     x    1 FALSE
#51     y    2  TRUE
#61     z   10 FALSE
#7      x    8  TRUE
#8      y    3  TRUE
#9      z    7  TRUE
#71     x    5  TRUE
#81     y    7 FALSE
#91     z   11 FALSE
#10     x    5 FALSE
#11     y   11 FALSE
#12     z    6  TRUE
#101    x    3 FALSE
#111    y    6 FALSE
#121    z    4 FALSE

Другой вариант - напрямую объединить два набора данных и, следовательно, реорганизовать порядок строк в желаемой последовательности.следующим образом:

S <- seq(3, nrow(df2)+nrow(df1), by = 6)
seqDF2 <- unlist(Map(seq, S-2, S))
seqDF1 <- setdiff(1:(nrow(df2)+nrow(df1)), seqDF2)
r2 <- rbind(df2, df1)[match(1:(nrow(df2)+nrow(df1)), c(seqDF2, seqDF1)),]

Это должно дать тот же результат, что и r1

rownames(r1) <- 1:nrow(r1)
rownames(r2) <- 1:nrow(r2)
identical(r1, r2)
##[1] TRUE
0 голосов
/ 27 февраля 2019

Отредактировано, чтобы делать каждые 3 строки.

Я не уверен, насколько это вообще, но чтобы избежать использования цикла, вы можете генерировать последовательности с шагами по два, которые повторяются n раз, а затем объединить и переупорядочитьданные.Возможно, не очень элегантно, но работает с вашими данными.

step=3
df1$col4<-rep(seq(from=1, to=dim(df1)[1]/step*2,by=2), each=step)
df2$col4<-rep(seq(from=2, to=dim(df2)[1]/step*2,by=2), each=step)
df<-rbind(df1,df2)
df<-df[order(df$col4),]

С выводом:

> step=3
> df1$col4<-rep(seq(from=1, to=dim(df1)[1]/step*2,by=2), each=step)
> df1$col4
 [1] 1 1 1 3 3 3 5 5 5 7 7 7
> df2$col4<-rep(seq(from=2, to=(dim(df2)[1]/step)*2,by=2), each=step)
> df2$col4
 [1] 2 2 2 4 4 4 6 6 6 8 8 8
> df<-rbind(df1,df2)
> df
   col1 col2  col3 col4
1     x    7  TRUE    1
2     y    8 FALSE    1
3     z    3 FALSE    1
4     x    5 FALSE    3
5     y    9 FALSE    3
6     z    6  TRUE    3
7     x    4  TRUE    5
8     y   11  TRUE    5
9     z   12  TRUE    5
10    x    2  TRUE    7
11    y    1  TRUE    7
12    z   10  TRUE    7
13    x    1 FALSE    2
14    y    5 FALSE    2
15    z   10  TRUE    2
16    x    7  TRUE    4
17    y   11  TRUE    4
18    z    8  TRUE    4
19    x    2 FALSE    6
20    y   12  TRUE    6
21    z    9 FALSE    6
22    x    4 FALSE    8
23    y    6 FALSE    8
24    z    3  TRUE    8
> df<-df[order(df$col4),]
> df
   col1 col2  col3 col4
1     x    7  TRUE    1
2     y    8 FALSE    1
3     z    3 FALSE    1
13    x    1 FALSE    2
14    y    5 FALSE    2
15    z   10  TRUE    2
4     x    5 FALSE    3
5     y    9 FALSE    3
6     z    6  TRUE    3
16    x    7  TRUE    4
17    y   11  TRUE    4
18    z    8  TRUE    4
7     x    4  TRUE    5
8     y   11  TRUE    5
9     z   12  TRUE    5
19    x    2 FALSE    6
20    y   12  TRUE    6
21    z    9 FALSE    6
10    x    2  TRUE    7
11    y    1  TRUE    7
12    z   10  TRUE    7
22    x    4 FALSE    8
23    y    6 FALSE    8
24    z    3  TRUE    8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...