2012-06-22 94 views
3

我在R中有一個兩列數據框,我想添加第三列,其值是前兩個的函數。 只要功能是一個簡單的數學公式沒有問題 data$c <- data$a*15 - 10 + data$b*0.5 但我的功能是不連續的,幷包含條件語句,我想這樣做: foo <- function(x,y){if (x<2) {return(0)} else {....}data$c <- foo(data$a, data$b) 但是,這讓我的錯誤。我錯過了什麼?如何使用R中的函數

+1

試着問一個問題時提供更多的信息。如果有人幫助你。 –

+0

這個問題完全可以回答,因爲它是。 –

回答

0
df = data.frame(a=rnorm(20),b=runif(20)) 

new_var = function(x,y) 
{ 
    if(x<0) 
    { x = x^2} 
    else 
    { x = x^3} 

    if(y<.5) 
    { -log10(y)} 
    else 
    { 
    exp(y) 
    } 
    return((2*(x+y))/x*y) 
} 

df$c = sapply(1:length(df$a), function(i){new_var(df$a[i],df$b[i])}) 

head(df) 
      a   b   c 
1 -0.09149107 0.04834675 0.65517298 
2 -2.43732351 0.04086087 0.08228385 
3 -1.69573283 0.54795413 1.30474339 
4 -0.40106220 0.72952356 8.07641367 
5 -0.38244706 0.65524147 7.18118555 
6 0.76334945 0.38455655 1.43404971 
+0

Yess!迭代有訣竅。 – Ivana

+0

不要忘記提高你認爲很好的答案。克里斯的答案是,在時間和cpu使用方面,prob更有效率。如果你已經發布了你的功能,我們可以提供更多的幫助! –

+0

我還是缺乏這樣的聲譽.... – Ivana

2

您正在尋找ifelse功能。首先創建一個數據幀:

> d <- data.frame(x = rnorm(5), y=rnorm(5)) 
> d 
      x   y 
1 -0.3581471 0.18149804 
2 0.5096839 0.01260114 
3 0.6742558 1.04851531 
4 1.0761349 -0.17504221 
5 -0.2373933 -1.11475886 

現在創建使用ifelse一個額外的列:

> d$z <- ifelse(d$x < 0, 0, d$y + 1) 
> d 
      x   y   z 
1 -0.3581471 0.18149804 0.0000000 
2 0.5096839 0.01260114 1.0126011 
3 0.6742558 1.04851531 2.0485153 
4 1.0761349 -0.17504221 0.8249578 
5 -0.2373933 -1.11475886 0.0000000