2013-06-27 3 views
1

나는 이것이 정말로 분명한 질문이지만 꽤 잘 모르겠다.조건부로 새 열 만들기

test <- data.frame(A = c(1:10), 
       B = c(1:10), C = c(1:10), 
       P = c(1:10)) 

내가 "P"라는 열이 있으면, 테스트 "Z"라는 새 열을 만들고 계산에 일부 콘텐츠를 넣을 :

나는 다음과 같은 데이터 세트가 있다고 가정하자 P.

에서

내가 다음 코드 (! 그냥 내가 아직 그와 아무것도 할 얻기 위해 시도하지했습니다 시도하고 조건부로 열을 만들어 갈 수있는) 작성 :

Clean <- function(data) { 
    if("P" %in% colnames(data)) {   
    data$Z <- NA 
     } 
    else { 
    cat("doobedooo") 
     } 
    } 
Clean(test) 

을하지만, 보지 못한다. 아무 일도하지 않고, 왜 데이터 세트에서 test$Z <- NA을 단순히 실행해도 작동하지 않습니다. "doobedooo"를 거기에 넣으면 첫 번째 조건에서 false를 반환하는지 확인합니다. 그렇게하지 않는 것 같습니다.

진술이 작동하는 방식을 간단히 오해 했습니까?

답변

4

함수에서 값을 반환하고 해당 값을 개체에 할당해야합니다. 다른 많은 언어 들과는 달리, R은 최소한 많은 일을하지 않아도 현재 위치에서 객체를 수정하지 않습니다.

Clean <- function(data) { 
    if("P" %in% colnames(data)) {   
     data$Z <- NA 
    } else { 
     cat("doobedooo" 
    } 
    return(data) 
} 
test <- Clean(test) 
+0

아하! 나는 그것이 명백한 무엇인가 알았다, 고맙다. – Froom2

1

@HongOi 답변은 귀하의 질문에 대한 직접적인 답변입니다. 내 것은 당신의 문제를 다루는 R 방법입니다. 만들려하기 때문에, 다른 사람의 다른 열 조합, 당신은 예를 들어, transform (또는 within)를 사용할 수 있습니다 :

if('P' %in% colnames(test)) 
    test <- transform(test,Z={## you can put any statement here 
           x=P+1 
           x^2 
           round(x/12,2) 
          } 
         ) 

head(test) 
    A B C P Z 
1 1 1 1 1 0.17 
2 2 2 2 2 0.25 
3 3 3 3 3 0.33 
4 4 4 4 4 0.42 
5 5 5 5 5 0.50 
6 6 6 6 6 0.58 
0

이전 대답은 이미 당신이 필요로하는 모든 것을 제공합니다. 그러나 이러한 문제를 해결할 수있는 또 다른 방법이 있습니다. R에서 environment을 사용하면 전체 테이블을 return()하는 대신 참조로 데이터를 설정하고 추가 할 수 있습니다 (일부분을 변경하더라도).

env <- new.env() 
env$test <- test 

system.time({ 
Clean <- function(data) { 
    if("P" %in% names(data$test)) {   
    data$test$Z <- NA 
    } 
    else { 
    cat("doobedooo") 
    } 
} 
Clean(env) 
}) 

> env$test 
    A B C P Z 
1 1 1 1 1 NA 
2 2 2 2 2 NA 
3 3 3 3 3 NA 
4 4 4 4 4 NA 
5 5 5 5 5 NA 
6 6 6 6 6 NA 
7 7 7 7 7 NA 
8 8 8 8 8 NA 
9 9 9 9 9 NA 
10 10 10 10 10 NA 
관련 문제