如果R中的函数内的条件状态

时间:2015-06-18 12:06:53

标签: r function if-statement conditional-statements

我有一个问题对很多人来说可能很容易。我想编写一个函数,它将根据所选列中的条件进行计算。向您展示一个示例会更容易:

con <- c("A", "B", "B", "C", "C", "A", "D", "A", "B", "D", "D", "D")
value <- c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2)
dat <- data.frame(con, value)
head(dat)

所以有一种可能性就是以这种简单的方式做到这一点:

dat$new <- ifelse(dat$con == "A", dat$value*10,
             ifelse(dat$con == "B", dat$value*100, dat$value*1000))
head(dat)

但是,我的问题是该功能将如何?我尝试过类似的东西,但它没有用。有人可以帮我解释一下缺失和错误吗?

calc <- function(dat) {
           if(dat[, con] == "A") {
           new <- dat$value*10 
           }  
           if(dat[, con] == "B") {
           new <- dat$value*100 
           } else {
           new <- dat$value*1000
         }
       }
calc(dat) 

2 个答案:

答案 0 :(得分:3)

您还可以创建不包含ififelse的功能:

calc <- function(data)
  transform(data, new = value * 1000 / 100 ^ (con == "A") / 10 ^ (con == "B"))

该功能基于数学运算。

calc(dat)
#    con value  new
# 1    A     1   10
# 2    B     3  300
# 3    B     2  200
# 4    C     1 1000
# 5    C     1 1000
# 6    A     1   10
# 7    D     2 2000
# 8    A     1   10
# 9    B     2  200
# 10   D     3 3000
# 11   D     3 3000
# 12   D     2 2000

答案 1 :(得分:2)

calc <- function(dat) {
  dat$new <- ifelse(dat[,'con'] == 'A', dat[,'value']*10,
         ifelse(dat[,'con'] == 'B', dat[,'value']*100,
                dat[,'value']*1000)
         )
  dat
}

子集化运算符$在函数中存在问题。相反,使用框架DF[,'<variable>']会更好。另外,请注意变量名称(列名称)周围的引号。您的原始功能也不会将结果打印到屏幕上。调用该函数时将返回最后一个命令。

calc(dat)
   con value  new
1    A     1   10
2    B     3  300
3    B     2  200
4    C     1 1000
5    C     1 1000
6    A     1   10
7    D     2 2000
8    A     1   10
9    B     2  200
10   D     3 3000
11   D     3 3000
12   D     2 2000