如何将 2 个数据帧中的行交织在一起?
How can I interleave rows from 2 data frames together?
如何将 2 个数据帧中的行交织在一起,就像完美的 riffle shuffle 一样?
示例数据:
df1 <- data.frame(df = 1, id = 1:5, chr = 'puppies')
df2 <- data.frame(df = 2, id = 1:5, chr = 'kitties')
df1:
df id chr
1 1 1 puppies
2 1 2 puppies
3 1 3 puppies
4 1 4 puppies
5 1 5 puppies
df2:
df id chr
1 2 1 kitties
2 2 2 kitties
3 2 3 kitties
4 2 4 kitties
5 2 5 kitties
想要的结果:
df id chr
1 1 1 puppies
2 2 1 kitties
3 1 2 puppies
4 2 2 kitties
5 1 3 puppies
6 2 3 kitties
7 1 4 puppies
8 2 4 kitties
9 1 5 puppies
10 2 5 kitties
独立地为每个数据框分配行号,然后通过行号和数据框id绑定行和sort/arrange。在这个例子中,行号是微不足道的,因为 id 是连续的并且充当行号。但在一般情况下,应该使用行号。
这是一个使用 dplyr 的例子:
df1 %>%
mutate(row_number = row_number()) %>%
bind_rows(df2 %>% mutate(row_number = row_number())) %>%
arrange(row_number, df)
输出:
df id chr row_number
(dbl) (int) (chr) (int)
1 1 1 puppies 1
2 2 1 kitties 1
3 1 2 puppies 2
4 2 2 kitties 2
5 1 3 puppies 3
6 2 3 kitties 3
7 1 4 puppies 4
8 2 4 kitties 4
9 1 5 puppies 5
10 2 5 kitties 5
这是我认为有效的基本 R 方法。有一点设置成本。我还必须使用字符向量而不是因子 (stringsAsFactors=F)
# setup a blank data.frame of the proper dimensions
df <- data.frame(df=1:(nrow(df1) + nrow(df2)),
id=1:(nrow(df1) + nrow(df2)),
chr=1:(nrow(df1) + nrow(df2)))
# fill it in with subscripting
df[1:(nrow(df1) + nrow(df2)) %% 2 == 1,] <- df1
df[1:(nrow(df1) + nrow(df2)) %% 2 == 0,] <- df2
df
df id chr
1 1 1 puppies
2 2 1 kitties
3 1 2 puppies
4 2 2 kitties
5 1 3 puppies
6 2 3 kitties
7 1 4 puppies
8 2 4 kitties
9 1 5 puppies
10 2 5 kitties
数据
df1 <- data.frame(df = 1, id = 1:5, chr = 'puppies', stringsAsFactors=F)
df2 <- data.frame(df = 2, id = 1:5, chr = 'kitties', stringsAsFactors=F)
非 dplyr 解决方案是使用 gdata
包中的 interleave
函数。
gdata::interleave(df1, df2)
在 base R 中,我发现使用矩阵进行此类操作比使用 data.frames 更容易。
这条相当冗长的单行代码应该有效:
setNames(data.frame(t(matrix(unlist(t(cbind(df1,df2))),ncol(df1)))),names(df1))
# df id chr
#1 1 1 puppies
#2 2 1 kitties
#3 1 2 puppies
#4 2 2 kitties
#5 1 3 puppies
#6 2 3 kitties
#7 1 4 puppies
#8 2 4 kitties
#9 1 5 puppies
#10 2 5 kitties
如何将 2 个数据帧中的行交织在一起,就像完美的 riffle shuffle 一样?
示例数据:
df1 <- data.frame(df = 1, id = 1:5, chr = 'puppies')
df2 <- data.frame(df = 2, id = 1:5, chr = 'kitties')
df1:
df id chr
1 1 1 puppies
2 1 2 puppies
3 1 3 puppies
4 1 4 puppies
5 1 5 puppies
df2:
df id chr
1 2 1 kitties
2 2 2 kitties
3 2 3 kitties
4 2 4 kitties
5 2 5 kitties
想要的结果:
df id chr
1 1 1 puppies
2 2 1 kitties
3 1 2 puppies
4 2 2 kitties
5 1 3 puppies
6 2 3 kitties
7 1 4 puppies
8 2 4 kitties
9 1 5 puppies
10 2 5 kitties
独立地为每个数据框分配行号,然后通过行号和数据框id绑定行和sort/arrange。在这个例子中,行号是微不足道的,因为 id 是连续的并且充当行号。但在一般情况下,应该使用行号。
这是一个使用 dplyr 的例子:
df1 %>%
mutate(row_number = row_number()) %>%
bind_rows(df2 %>% mutate(row_number = row_number())) %>%
arrange(row_number, df)
输出:
df id chr row_number
(dbl) (int) (chr) (int)
1 1 1 puppies 1
2 2 1 kitties 1
3 1 2 puppies 2
4 2 2 kitties 2
5 1 3 puppies 3
6 2 3 kitties 3
7 1 4 puppies 4
8 2 4 kitties 4
9 1 5 puppies 5
10 2 5 kitties 5
这是我认为有效的基本 R 方法。有一点设置成本。我还必须使用字符向量而不是因子 (stringsAsFactors=F)
# setup a blank data.frame of the proper dimensions
df <- data.frame(df=1:(nrow(df1) + nrow(df2)),
id=1:(nrow(df1) + nrow(df2)),
chr=1:(nrow(df1) + nrow(df2)))
# fill it in with subscripting
df[1:(nrow(df1) + nrow(df2)) %% 2 == 1,] <- df1
df[1:(nrow(df1) + nrow(df2)) %% 2 == 0,] <- df2
df
df id chr
1 1 1 puppies
2 2 1 kitties
3 1 2 puppies
4 2 2 kitties
5 1 3 puppies
6 2 3 kitties
7 1 4 puppies
8 2 4 kitties
9 1 5 puppies
10 2 5 kitties
数据
df1 <- data.frame(df = 1, id = 1:5, chr = 'puppies', stringsAsFactors=F)
df2 <- data.frame(df = 2, id = 1:5, chr = 'kitties', stringsAsFactors=F)
非 dplyr 解决方案是使用 gdata
包中的 interleave
函数。
gdata::interleave(df1, df2)
在 base R 中,我发现使用矩阵进行此类操作比使用 data.frames 更容易。 这条相当冗长的单行代码应该有效:
setNames(data.frame(t(matrix(unlist(t(cbind(df1,df2))),ncol(df1)))),names(df1))
# df id chr
#1 1 1 puppies
#2 2 1 kitties
#3 1 2 puppies
#4 2 2 kitties
#5 1 3 puppies
#6 2 3 kitties
#7 1 4 puppies
#8 2 4 kitties
#9 1 5 puppies
#10 2 5 kitties