【发布时间】:2020-12-26 00:31:33
【问题描述】:
假设以下数据框和函数:
cond var_x var_y
cond1 2 3
cond1 3 0.1
cond2 2 2
cond2 1 0.2
my_fun1 <- function(x) {
act_vec <- rnorm(500, x, x/4)
RT = 0
for (i in 1:length(act_vec)) {
my_act = act_vec[i]
my_rt = my_act
RT = RT + my_rt
}
RT = RT/500
return(RT)
}
my_fun2 <- function(x,y) {
act_vec1 <- rnorm(500, x, x/4)
act_vec2 <- rnorm(500, y, y/4)
RT = 0
for (i in 1:length(act_vec1)) {
my_act1 = act_vec1[i]
my_act2 = act_vec1[i]*act_vec2[i]
my_rt = min(my_act1, my_act2)
RT = RT + my_rt
}
RT = RT/500
return(RT)
}
以下代码将函数my_fun1 应用于DF 中的每一行,如果是DF$cond == 'cond1',否则是my_fun2。
my_test_vec = c()
for (i in (1:nrow(DF))) {
if (DF$cond[i] == 'cond1') {
my_test = my_fun1(DF$var_x[i])
} else {
my_test = my_fun2(DF$var_x[i], DF$var_y[i])
}
my_test_vec = c(my_test_vec, my_test)
}
然而,这个 for 循环的计算效率很低。因此,我想以一种一次性应用所有操作的方式来实现它。到目前为止,我的方法不起作用,看起来像这样:
DF$results <- ifelse(DF$cond == 'cond1',
my_fun1(DF$var_x),
my_fun2(DF$var_x, DF$var_y))
有什么建议吗?
【问题讨论】:
-
ifelse 通常非常有效。如果您发布示例数据并代表 myfun 1 和 2,World 会帮助您使用 ifelse 找到您的问题。
-
希望编辑满意
标签: r for-loop if-statement vectorization