2015-02-03 2 views
0

나는여러 ifelse 문

 var1 var2 a1 a2 
1 a b  y  z 
2 b a  z  y 
3 b b  z  z 

다음 코드에서 생성 df라고 (가)

help <- data.frame(var1 = c("a", "b", "b"), var2 = c("b", "a", "b"), a1 = c(y, z, z), a2 = c(z, y, z)) 

내 의도가 I (1) 모든 A1 값을 대체 할 수 있어요 ifelse 문을 만드는 것입니다 아래에있다 (2) var2가 'a'일 때 모든 a2 값을 'bp'로 바꿉니다. var1 또는 var2가 'a'가 아닌 경우 값을 변경하고 싶지 않습니다.

ifelse 명령은이 문제를 해결하는 가장 좋은 방법이 아닙니까? help$a1[help$a1 == "a"] <- "bp"을 사용하여 수동으로 각각 하나씩 작업하기 시작했습니다. 그러나 여러 변수와 대형 데이터 세트를 가지고 있기 때문에 약간 시간이 걸릴 것입니다. 어떤 도움이라도 좋을 것입니다.

감사합니다.

+0

대체 할 규칙은 몇 개입니까? 내 추측으로는 규칙이있는 보충 데이터 세트가 귀하의 경우 도움이 될 수 있다는 것입니다. 'var1.rules <- c (a = 0, b = 1, c = 2)'와'var2.rules <- c (a = 0, b = 1, c = 2)' –

+0

게시물을 편집해야했습니다. 모든 문자 벡터가 필요하기 때문에 약간. 나는 var1과 var2 내에서 변경 될 필요가있는 60 가지의 고유 한 변수를 가지고있다. 그러나 그 것이 당신의 질문에 대답하는지 확실하지 않다 ... – bpace

+0

당신은 열 이름이'c '('var1 ','var2 ',' 'varN', 'a1', a2 ','a3 ', ...,'aN ')'과 같은 값을 가질 수 있으며,'varX '열의 값을'bp ' 'aX'열의 행은 1에서 N까지의 모든 X에 대해 'a'와 같습니다. –

답변

1

표준 하위 집합을 사용할 수 있습니다. a1a2

df 
# var1 var2 a1 a2 
#1 a b y z 
#2 b a z y 
#3 b d z z 

df[,3:4][df[,1:2]=="a"]<-"bp" 

df 
# var1 var2 a1 b2 
#1 a b bp z 
#2 b a z bp 
#3 b d z z 
또한 두 경우 모두 같은

sel<-paste0("var",1:2) 
mut<-paste0("a",1:2) 
df[,mut][df[,sel]=="a"]<-"bp" 

의 내부를 명명 규칙을 활용할 수

, 예를 들어, 다음, "문자"클래스의 것을 질문 편집 당 가정 df[,sel]=="a"은 과 동일한 모양 (따라서 df[,mut]과 동일한 모양) 인 TRUE과 같은 모양의 논리 행렬을 반환합니다. 여기서 "a"가있는 부분 만이 반환됩니다. 외부 부분, 예를 들어. df[,mut][...]은 해당 논리 매트릭스를 사용하여 할당 대상 서브 세트를 나타냅니다.

+0

Webb는 그 의미를 설명 할 수 있습니다 ... 번역 할 때 '열 1 또는 2에'가 포함되어 있으면 df에서 열 3 또는 4를 'bp'로 변경합니다. ' 그 소리 맞지? – bpace

+0

@bpace 내부 비트 df [, 1 : 2] == "a"는'df [, 1 : 2]'와 같은 모양의 논리 행렬을 반환한다 (따라서'df [, 3 : 4] '), 어디에 "a"가있는 곳에서만 사실입니다. 외부 비트'df [, 3 : 4] [...]'는 논리적 행렬로 서브 셋팅하고 있으며, 행렬의 'TRUE'값에 해당하는 엔트리 만이 할당 대상이다. –