我有一个问题对很多人来说可能很容易。我想编写一个函数,它将根据所选列中的条件进行计算。向您展示一个示例会更容易:
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)
答案 0 :(得分:3)
您还可以创建不包含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
答案 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