2016-11-19 8 views
2

Iは、有用な情報のデータフレームを有する:抽出値 - R

X = c(1,2,3,4,5,6,7,8,9,10) 
Y = c(5,4,3,2,1,0,1,2,3,4) 
Z = c(11,12,13,14,15,16,17,18,19,20) 

df <- data.frame(X, Y, Z) 

、行と列の位置のデータフレーム:

row <- c(6,2,5) 
column <- c(1,2,3) 


pos <- data.frame(row, column) 

I希望posの列と行の位置を使用して、これらの位置を占めるdfの値を返す関数(fun)を使用します。

fun(df, pos$row, pos$column) 
[1] 6 4 15 

私はこのようにそれを行うことができると思ったが、無駄

df[c(pos$row),c(pos$col)] 

答えて

3

に行/列インデックスがmatrixとして働くので、我々はmatrixおよび使用に「POS」に変換しますその値を抽出するための行/列のインデックスとして。 vector sのリターンのcbindmatrix

df[cbind(pos$row, pos$column)] 

として

df[as.matrix(pos)] 

またはそれ以外の場合は、 'POS' のcbind列これは、あなたは

fExtract <- function(dat, indexDat){ 
       dat[as.matrix(indexDat)] 
      } 
fExtract(df, pos) 
#[1] 6 4 15 
+1

ファンタスティック@akrunを、今日はそんなに学んでいます –

1

関数に変換することができますまた、関数の呼び出しの中でこれを行うこともできますsapplyは、posの列ダウン作業:

sapply(seq(nrow(pos)), function(i) df[pos$row[i], pos$column[i]]) 
[1] 6 4 15