2016-06-14 22 views
6

Satırları mükemmel bir karıl karışıklığı gibi 2 veri çerçevesinden nasıl arayabilirim?Satırları 2 veri çerçevesinden nasıl arayabilirim?

Örnek veriler:

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 

İstenen sonucu:

 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 

cevap

4

Her veri çerçevesine satır numaralarını bağımsız olarak atayın, ardından satırları bağlayın ve sıra numarası ve veri çerçevesi kimliğine göre sıralayın/düzenleyin. Bu örnekte, ids sıralı ve satır numarası olarak hareket ettiğinden, sıra numaraları önemsizdir. Ancak genel durumda, sıra numaraları kullanılmalıdır.

İşte dplyr kullanıldığı bir örnek:

df1 %>% 
    mutate(row_number = row_number()) %>% 
    bind_rows(df2 %>% mutate(row_number = row_number())) %>% 
    arrange(row_number, df) 

Çıktı:

İşte
 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 
3

Ben eserler inandığım bir baz R yöntemidir. Kurulum maliyeti biraz var. Ayrıca olmayan bir dplyr çözelti gdata pakette interleave fonksiyonu kullanmak olacaktır faktörleri (stringsAsFactors = F) daha ziyade

# 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 

veri

df1 <- data.frame(df = 1, id = 1:5, chr = 'puppies', stringsAsFactors=F) 
df2 <- data.frame(df = 2, id = 1:5, chr = 'kitties', stringsAsFactors=F) 
5

karakter vektörlerin kullanılması gerekmektedir. baz R ise

gdata::interleave(df1, df2) 
4

, böyle manipülasyonlar data.frames ile daha matrisler ile daha kolay olduğunu bulmak. Bu oldukça uzun tek liner çalışmalıdır:

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