2016-10-21 5 views
3

r에 forloop을 사용하지 않고 조건에 대한 데이터 프레임의 각 행을 테스트하고 반환 값을 조건에 해당하는 별도의 행렬 요소로 사용하려고합니다. .ifelse 문에서 조건부 행렬 요소를 반환하는 중

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)과 데이터 프레임 결과 (데이터) :

지금 LOCATION1 위치 2 다르면
> 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   

, 내가 얻을하려는 다음 예는 그 움직임의 방향을 말해주는 대응하는 행렬 요소.

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

당신은 실제로 행과 열 이름의 매트릭스를 사용하거나 행렬을 서브 세트와 indices 수 있습니다 감사합니다 . 이 표기법으로

, 당신의 문제는 한 - 라이너 :

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)]) 

를 사용할 수 있지만, 위의 방법은 더 나은 그래서이 행렬의 대각선은 원하는 결과입니다.

관련 문제