2016-10-21 4 views
3

私は、条件のために私のデータフレームの各行をテストしていますが、rのforloopを使わずに戻り値を返すことは条件に対応する別個の行列。ここでの例である:ifelse文がRの条件付き行列要素を返すR

ax <- matrix(data=c("x","UP","DN","x"),nrow=2,dimnames=list(c("site1","site2"),c("site1","site2"))) 
data <- data.frame(Location1=c("site1","site1","site2","site1","site2","site2","site2","site1"),Location2=c("site1","site2","site1","site2","site2","site2","site1","site1")) 

これは、マトリックス(AX)及びデータフレーム(データ)をもたらす:

> ax 
     site1 site2 
    site1 "x" "DN" 
    site2 "UP" "x" 


> data 
    Location1 Location2 
1 site1  site1   
2 site1  site2   
3 site2  site1  
4 site1  site2   
5 site2  site2   
6 site2  site2   
7 site2  site1  
8 site1  site1   

LOCATION1が位置2と異なる場合今、私が取得したいですその動きの方向を私に知らせる対応する行列要素。

data$movement <-ifelse(data$Location1!=data$Location2,ax[as.character(data$Location1),as.character(data$Location2)],"x") 

しかし、これは、この出力になり:私は私のコードは..です前に、このような文ifelse使用しましたが、別のマトリックスを照会しようとしたときに正しい出力を得ることは本当に私を逃亡さ

data 
    Location1 Location2 movement 
1 site1  site1  x 
2 site1  site2  x 
3 site2  site1  UP 
4 site1  site2  x 
5 site2  site2  x 
6 site2  site2  x 
7 site2  site1  UP 
8 site1  site1  x 

任意のヘルプは大幅にあなたが実際に行列をサブセットする行と列の名前やインデックスのマトリックスを使用することができます

答えて

5

を高く評価され、これは簡単な問題になるようだが、私はそれを把握するように見えることはできません。この表記では

、あなたの問題はワンライナーです:

data$movement = ax[as.matrix(data)] 

data 
# Location1 Location2 movement 
# 1  site1  site1  x 
# 2  site1  site2  DN 
# 3  site2  site1  UP 
# 4  site1  site2  DN 
# 5  site2  site2  x 
# 6  site2  site2  x 
# 7  site2  site1  UP 
# 8  site1  site1  x 

ifelseは、テスト、はい結果、およびすべてのことのベクトルに無い結果を望んでいるので、あなたのifelseが動作していません同じ長さのしかし、あなたの結果はこれです:

ax[as.character(data$Location1),as.character(data$Location2)] 
#  site1 site2 site1 site2 site2 site2 site1 site1 
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x" 
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x" 
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP" 
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x" 
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP" 
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP" 
# site2 "UP" "x" "UP" "x" "x" "x" "UP" "UP" 
# site1 "x" "DN" "x" "DN" "DN" "DN" "x" "x" 

これは簡単にベクトルに強制されますが、間違った長さです。あなたはifelsediag(ax[as.character(data$Location1),as.character(data$Location2)])を使用することができますので、この行列の対角は、ご希望の結果である、またはあなたも

data$movement = diag(ax[as.character(data$Location1), as.character(data$Location2)]) 

を使用することができますが、上記の方法は、さらに良いです。