2016-08-29 2 views
0

두 개의 데이터 프레임 x와 y가 있습니다.두 데이터 프레임을 사용하여 조건문을 적용하는 함수

x<-data.frame("j"=c("A","B","C"),"k"=c(1,90,14)) 
    x j k 
    1 A 1 
    2 B 90 
    3 C 14 

y<-data.frame("A"=c(1,0,0,1,1),"B"=c(0,1,0,0,1),"C"=c(1,1,1,0,0)) 
    A B C 
1 1 0 1 
2 0 1 1 
3 0 0 1 
4 1 0 0 
5 1 1 0 

는 I 데이터 세트의 예에서 -1로 대체하거나 (1)가 이러한 결과를 얻을 수 있으므로의 A 열에서 1로 대체하고, 0이 있으면 조건문이있는 기능이 필요하다.

z<-data.frame("A"=c(1,-1,-1,1,1),"B"=c(-90,90,-90,-90,90),"C"=c(14,14,14,-14,-14)) 
    A B C 
1 1 -90 14 
2 -1 90 14 
3 -1 -90 14 
4 1 -90 -14 
5 1 90 -14 
+0

0을 -1로 바꾸면 기본적으로 곱하기 :'(- (y == 0) + y) * 행렬 (x $ k, nrow (y), ncol (y), byrow = TRUE)' – alistaire

+0

pf 열과 행의 순서가 x와 y 사이에서 일치하는 경우 : y [y == 0] <- -1; y * x $ k [col (y)]' – user20650

답변

1

다음은 잘 알려진 여러 가지 기능을 사용하는 기본 R의 재미있는 한 줄 짜기입니다. 및 y의 값에 따라 어느 제외 -1 또는 1을 승산 -

setNames(do.call(data.frame, Map(function(x, y) x * c(-1, 1)[y+1], x$k, y)), LETTERS[1:3]) 
    A B C 
1 1 -90 14 
2 -1 90 14 
3 -1 -90 14 
4 1 -90 -14 
5 1 90 -14 

내측 가장 x * c(-1, 1)[y+1] 함수가 (중 1, 90, 14 또는 스칼라) x의 값을 취한다.

Map은 x에 대한 x $ 값과 y 인수에 대한 data.frame y의 변수를 취하여 각 쌍에 대해 함수를 수행하고 목록을 반환합니다. 세 벡터.

이 목록은 do.call으로 data.frame으로 변환되고 변수 이름은 setNames과 함께 제공됩니다.

+0

apply 또는 lapply 및 ifelse를 사용하여 이러한 결과를 얻을 수있는 방법이 있습니까? –

+1

'Map'은'mapply'의 래퍼입니다. 'ifelse'는 꽤 느린 경향이 있습니다.'c (-1, 1) [y + 1]'은 실제로 ifelse의 역할을 수행하지만 빠릅니다. 'ifelse' 버전은'ifelse (y == 1, y, -1)'입니다. – lmo

관련 문제