2017-03-21 5 views
2

に1つのデータフレームからの位置によって要素を取得するのは、我々は2つのデータフレームを持っているとしましょう:

df1 <- data.frame(A = letters[1:3], B = letters[4:6], C = letters[7:9], stringsAsFactors = FALSE) 
    A B C 
1 a d g 
2 b e h 
3 c f i 

df2 <- data.frame(V1 = 1:3, V2 = 4:6, V3 = 7:9) 
    V1 V2 V3 
1 1 4 7 
2 2 5 8 
3 3 6 9 

私は、入力として単一の値またはの一つの要素を含むベクトルを取る関数を構築する必要がありますそれらの位置インデックスに従って他のデータフレームから要素を戻す。

機能は次のように動作するはずです:

> matchdf(values = c("a", "e", "i"), dfin = df1, dfout = df2) 
[1] 1 5 9 

> matchdf(values = c(1, 5, 9), dfin = df2, dfout = df1) 
[1] "a" "e" "i" 

> matchdf(values = c(1, 1, 1), dfin = df2, dfout = df1) 
[1] "a" "a" "a" 

これは私がこれまでにしようとしているものです:

requiere(dplyr) 
toVec <- function(df) df %>% as.matrix %>% as.vector 
matchdf <- function(values, dfin, dfout) toVec(dfout)[toVec(dfin) %in% values] 

# But sometimes the output values aren't in correct order: 
> matchdf(c("c", "i", "h"), dt1, dt2) 
[1] 3 8 9 
# should output 3 9 8 

> matchdf(values = c("a", "a", "a"), dfin = dt1, dfout = dt2) 
[1] 1 
# Should output 1 1 1 

は、それがタスクを容易にしている場合data.tableまたは/およびdplyrを使用する自由を感じます。私はループのないソリューションを好むだろう。

仮定

  • DF1からの要素がDF2私の意見あなたの正しい軌道上で
  • DIM(DF1)= DIM(DF2)
+3

異なっています。そして、データフレームをベクトルに変換するのではなく、まずベクトルで作業します。また、私はちょうど 'values = c(" a "、" e "、" i ")のような何かをするでしょう。 dplyrを使用して2つの関数を作成する代わりに、unlist(df2)[match(values、unlist(df1))]]を実行します。 –

+0

@DavidArenburgそれは、あなたの答えを投稿する必要があります – mat

答えて

-1
matchdf <- function(values, dfin, dfout){ 
     unlist(sapply(values, 
         function(val) dfout[dfin == val], 
         USE.NAMES = F) 
       ) 
} 

matchdf(c("c", "i", "h"), df1, df2) 
#should output 3 9 8 
[1] 3 9 8 
matchdf(values = c("a", "a", "a"), dfin = df1, dfout = df2) 
#should output 1 1 1 
[1] 1 1 1 
matchdf(values = c("X", "Y", "a"), dfin = df1, dfout = df2) 
#should output vector, not list 
[1] 1 
+0

これは、これは単なるコードダンプ(将来の読者にとっては役に立たない)であり、完全にベクトル化された操作上でループを実行するように教えているからです。 –

+0

はい、私は同意します - あなたの答えは私の方が良いです。私は非常に似たようなことをしようとしましたが、 'match '関数についてはわからなかったので、'%in%'でそれを行いました。私は今あなたのコメントのおかげで、知っている。私は両方のソリューションのタイミングを比較しようとしました。私の方がずっと悪いです。https://www.dropbox.com/s/trejyylvwtcdo5b/timing.png?dl=0 1時間でこの回答を削除します。 – utubun