如果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
您也可以创建一个没有 if
和 ifelse
的函数:
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
我有一个问题对你们中的很多人来说可能很容易。我想编写一个函数,该函数将根据所选列中的条件进行计算。举个例子会更容易:
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
您也可以创建一个没有 if
和 ifelse
的函数:
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