6

完璧なリフル シャッフルのように、2 つのデータ フレームの行をインターリーブするにはどうすればよいですか?

サンプルデータ:

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
4

4 に答える 4

6

dplyr 以外のソリューションは、パッケージinterleave内の関数を使用することです。gdata

gdata::interleave(df1, df2)
于 2016-06-14T16:31:43.170 に答える
4

ベース 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
于 2016-06-14T16:57:55.450 に答える
4

行番号を各データ フレームに個別に割り当ててから、行をバインドし、行番号とデータ フレーム ID で並べ替え/並べ替えます。この例では、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
于 2016-06-14T16:17:54.480 に答える
3

これは、私がうまくいくと信じているベース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)
于 2016-06-14T16:31:27.773 に答える