如果R中函数内的条件语句

If condition statment within function in R

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

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) 
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

您也可以创建一个没有 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