2017-03-03 8 views
1
##Make up 3 data frames 

Var<- c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11") 
res <- c(2,3.1,4.5,5.1,6.5,7.1,8.5,9.11,10.1,11.8,12.3) 
df_1 <- data.frame(res,Var) 

Var<- c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11") 
res <- c(2.2,3.3,4.5,5.1,6.5,13,0,0,10.1,1,12.3) 
df_2 <- data.frame(res,Var) 

Var<- c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11") 
res <- c(0,3.3,0,5.1,6.5,13,0,1,10.1,1,1) 
df_3 <- data.frame(res,Var) 

merged_df<- Reduce(function(...) merge(..., all=TRUE), list(df_1,df_2,df_3)) 

ここでの問題は、「merged_df」にdf_1の行「t1」、df_2の「t1」、df_3の「t1」などがありますが、上記の関数は値に基づいて並べ替えることです。複数のデータフレームを同じ行名(およびcol名)に変更せずにマージするにはどうすればいいですか?

これを解決する方法はありますか。 おかげ

+0

あなたは合併後に行をソートする方法がありますか? –

+0

これは私の質問 – Jack

+0

の一部ですが、by = c( 'Var'、 'res') 'という変数の順序を逆にするとどうなりますか?マージ後にソートしたい場合は、 'merge'文に' sort = FALSE'が必要です。 – rawr

答えて

3
# assign grp variables 
df_1$grp <- 'df_1' 
df_2$grp <- 'df_2' 
df_3$grp <- 'df_3' 

# merge data frames 
long_df <- do.call('rbind', list(df_1, df_2, df_3)) 

# output 
head(long_df) 
# res Var grp 
# 1 2.0 t1 df_1 
# 2 3.1 t2 df_1 
# 3 4.5 t3 df_1 
# 4 5.1 t4 df_1 
# 5 6.5 t5 df_1 
# 6 7.1 t6 df_1 

ソート列Var

long_df <- within(long_df, Var <- factor(Var, 
              levels = c("t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11"), 
              ordered = TRUE)) 

sort_long_df <- with(long_df, long_df[ order(Var), ]) 
head(sort_long_df, 10) 
# res Var grp 
# 1 2.0 t1 df_1 
# 12 2.2 t1 df_2 
# 23 0.0 t1 df_3 
# 2 3.1 t2 df_1 
# 13 3.3 t2 df_2 
# 24 3.3 t2 df_3 
# 3 4.5 t3 df_1 
# 14 4.5 t3 df_2 
# 25 0.0 t3 df_3 
# 4 5.1 t4 df_1 
+0

みんな、ありがとう! – Jack

関連する問題