に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)
異なっています。そして、データフレームをベクトルに変換するのではなく、まずベクトルで作業します。また、私はちょうど 'values = c(" a "、" e "、" i ")のような何かをするでしょう。 dplyrを使用して2つの関数を作成する代わりに、unlist(df2)[match(values、unlist(df1))]]を実行します。 –
@DavidArenburgそれは、あなたの答えを投稿する必要があります – mat