2013-06-27 56 views
1

我相当肯定这是一个非常明显的问题,但我无法弄清楚。有条件地创建一个新列

可以说我有以下数据集:

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

我想测试,如果有一个名为“P”列,创建一个名为“Z”新列,并把一些内容在其计算从P.

我写了下面的代码(只是尝试,并得到它有条件地创建专栏中,我还没有尝试让它做什么用的呢!):

​​

但它看不到米做任何事情,我不明白为什么,当简单地运行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通过引用来设置和添加数据,而不是返回整个表(即使您更改了它的一部分)。

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