2012-12-02 5 views
4

저는 현재 현재 고심하고있는 간단한 질문을 가지고 있습니다. 나는 새 열 ('C')를 만들려면 어떻게해야r에있는 if 문을 사용하여 열 채우기

a <- c(1:5) 
b <- c(1,3,5,9,11) 
df1 <- data.frame(a,b) 

다음 열 B에 문 경우 사용 채워집니다 : 나는 예제 dataframe이있는 경우. 예를 들어보다 큰 6

이다 (B)에서 그 값 3 내지 5 '토끼'이다 이러한 B의 값을 1 또는 2 '개'이다 이러한 B의 값 "고양이" 따라서 dataframe df1을 사용하는 'c'열은 cat, dog, dog, rabbit, rabbit라고 읽습니다.

미리 감사드립니다.

+0

매우 자주 묻습니다. 예를 들면 다음과 같습니다. http://stackoverflow.com/questions/12379128/r-switch-statement-on-comparisons/12379251#12379251. – flodel

+0

@flodel : 답안에서 findInterval을 사용하려면 +1하십시오. 당신이 말했듯이 이것은 여러 번 대답되었습니다. –

답변

2
df1 <- 
    transform(
     df1 , 
     c = 
      ifelse(b %in% 1:2 , 'cat' , 
      ifelse(b %in% 3:5 , 'dog' , 'rabbit'))) 
1

ifelse()는 유용하지만 때때로 직관적으로 기대할 수있는 것을 제공하지 않습니다. 그래서, 나는 그것을 쓰고 싶다.

a <- c(1:5) 
b <- c(1,3,5,9,11) 
df1 <- data.frame(a,b) 

species <- function(x) { 
if(x == 1 | x == 2) y <- "cat" 
if(x > 2 & x < 6) y <- "dog" 
if(x > 6) y <- "rabbit" 
return(y) 
} 

df1$c <- sapply(df1$b,species) 
5
dfrm$dc <- c("dog", "cat", "rabbit")[ findInterval(dfrm$b, c(1, 2.5, 5.5, Inf)) ] 

findInterval 접근 훨씬 빠르게 중첩 ifelse 전략보다 것이고, 나는 중첩되지 if 문을 통해 루프 기능보다 매우 빠르게 같은데요. 큰 데이터로 작업하는 사람들은 비효율적 인 알고리즘을 선택할 때 그 차이점에 주목합니다.

이것은 실제로 요청을 처리하지는 않았지만 R의 새로운 사용자가 문제에 대한 가장 표현적이고 효율적인 접근 방법을 알 것이라고 항상 생각하지는 않습니다. "IF 사용"요청은 두 개의 주요 매크로 통계 프로세서 SPSS 및 SAS의 일반적인 코딩 방법을 번역하려는 노력처럼 들렸다. R if 제어 구조는 일반적으로 첫 번째 요소에 대한 인수가 첫 번째 요소에 대해서만 평가되기 때문에 일반적으로 열을 코딩하는 효율적인 방법은 아닙니다. 그 자체로는 열을 처리하지 않지만 ifelse 함수는 그렇게합니다. 문자 값 대신 factor 값을 전달 했더라도 cut 함수가 여기 (적절한 breakslabels 매개 변수 사용)에 사용되었을 수 있습니다. findInterval 접근 방식은 여러 수준 (단일 ifelse 수없는)을 반환하는 능력 때문에 선택되었습니다. 내 생각에 체인이나 둥지를 ifelse 's는 중첩의 약 2 또는 3 레벨 이후에 빠르게 추악하고 혼란스럽게됩니다.

+3

미래의 누군가가이 대답을 가로막으며, 가까운 대괄호 앞에 친한 친구가 없습니다. – Daniel

+0

@Daniel : 오류를 지적 해 주셔서 감사합니다. 누군가가 그것을 고칠 때까지 당신의 표기법을 넘어서 1 년 넘게 기다렸습니다. 그들은 두 번째 단락으로 바뀐 답신 본문에 부적절하게 설명을 남겼습니다. –

관련 문제