R:运行一个函数,直到对函数的上一个输出的条件测试对所有行都为真
我试图在R中编写一个脚本,重复一个条件测试或函数,直到所有值都满足该条件。我可以通过复制和粘贴来实现这一点,但正如我们所知,这将变得很麻烦更新我早些时候用虚构的数据和虚构的条件发布了这篇文章,但遗憾的是,我无法弄清楚它-这是真实的情况:我正在尝试调整一行中多个点之间的坡度,以创建满足小于0.02条件的平滑行R:运行一个函数,直到对函数的上一个输出的条件测试对所有行都为真,r,tidyverse,R,Tidyverse,我试图在R中编写一个脚本,重复一个条件测试或函数,直到所有值都满足该条件。我可以通过复制和粘贴来实现这一点,但正如我们所知,这将变得很麻烦更新我早些时候用虚构的数据和虚构的条件发布了这篇文章,但遗憾的是,我无法弄清楚它-这是真实的情况:我正在尝试调整一行中多个点之间的坡度,以创建满足小于0.02条件的平滑行 # initial info: NS_max_slope <- 0.02 #NS = North-South slope. These values are positive. So
# initial info:
NS_max_slope <- 0.02
#NS = North-South slope. These values are positive. South-North slopes are negative. We're only checking NS slopes with this.
#the data
Z LF_IN_1 old_z_1 NS_slope include
1 285.2573 NA NA NA NA
2 285.2283 16.4147 285.2573 -0.001766709 -0.001766709
3 285.154 24.3543 285.2283 -0.003050796 -0.003050796
4 285.0791 24.3543 285.154 -0.003075432 -0.003075432
5 283 24.3544 285.0791 -0.085368558 -0.085368558
6 284.8716 19.0761 283 0.098112298 0.098112298
7 284.8364 19.0761 284.8716 -0.001845241 -0.001845241
8 284.788 24.3543 284.8364 -0.001987329 -0.001987329
9 284.7599 24.3544 284.788 -0.001153796 -0.001153796
10 284.9187 24.3543 284.7599 0.006520409 0.006520409
11 285 16.4147 284.9187 0.004952878 0.004952878
12 280 215.3846194 285 -0.023214285 NA
#初始信息:
NS_max_slopeRecursionrowwise
可以工作:
recursive_if <- function(x) {
if (x<0) {
cat(x,' ')
recursive_if(x+0.25)
} else {
cat('done \n')
NA
}
}
df_1 <- df %>% rowwise() %>% mutate(test_1 = recursive_if(x))
#done
#-1.324969 -1.074969 -0.8249694 -0.5749694 -0.3249694 -0.07496937 done
#done
#-0.2456965 done
#-1.611627 -1.361627 -1.111627 -0.8616274 -0.6116274 -0.3616274 -0.1116274 done
#-0.6212984 -0.3712984 -0.1212984 done
#-0.7625072 -0.5125072 -0.2625072 -0.01250716 done
#-1.480466 -1.230466 -0.9804658 -0.7304658 -0.4804658 -0.2304658 done
#done
#-0.8605357 -0.6105357 -0.3605357 -0.1105357 done
#...
df_1
x test_1
<dbl> <lgl>
1 0.777 NA
2 -1.32 NA
3 1.05 NA
4 -0.246 NA
5 -1.61 NA
6 -0.621 NA
7 -0.763 NA
8 -1.48 NA
9 0.815 NA
10 -0.861 NA
...
recursive\u如果为什么不:
df <- data.frame(x = rnorm(20))
while(any(df < 0)) {
cond <- df < 0
df[cond] <- df[cond] + 0.25
df[!cond] <- 1
}
df[df > 0] <- NA
df那么如果最后都是NA
,你想从中得到什么值?好问题-这不是我的实际函数或条件测试,我的实际目标不是让每个值都高于零。我简化了一切,试图引出一个根本问题,即重新应用一个函数直到满足一个条件。你测试过它吗?至少在我这方面不起作用。嗨@Waldi谢谢你的回答。我试着把这个应用到我的“真实”剧本中,但没能弄明白。我将问题更新为“真实”信息。谢谢
elev_adjust <- function(data) {
## slope check for fail
slope_check_df <- data %>%
mutate(slope_fail = slope_check(slope = include))
# slope adjust
iteration_1 <- slope_check_df %>% mutate(elev_adjust_1 = elev_adj(data = slope_check_df),
elev_adjust_lag_1 = lag(elev_adjust_1),
slope_adj_1 = (elev_adjust_1 - elev_adjust_lag_1) / LF_IN_1,
slope_check_1 = slope_check(slope_adj_1))
iteration_1
}
recursive_if <- function(x) {
if (x<0) {
cat(x,' ')
recursive_if(x+0.25)
} else {
cat('done \n')
NA
}
}
df_1 <- df %>% rowwise() %>% mutate(test_1 = recursive_if(x))
#done
#-1.324969 -1.074969 -0.8249694 -0.5749694 -0.3249694 -0.07496937 done
#done
#-0.2456965 done
#-1.611627 -1.361627 -1.111627 -0.8616274 -0.6116274 -0.3616274 -0.1116274 done
#-0.6212984 -0.3712984 -0.1212984 done
#-0.7625072 -0.5125072 -0.2625072 -0.01250716 done
#-1.480466 -1.230466 -0.9804658 -0.7304658 -0.4804658 -0.2304658 done
#done
#-0.8605357 -0.6105357 -0.3605357 -0.1105357 done
#...
df_1
x test_1
<dbl> <lgl>
1 0.777 NA
2 -1.32 NA
3 1.05 NA
4 -0.246 NA
5 -1.61 NA
6 -0.621 NA
7 -0.763 NA
8 -1.48 NA
9 0.815 NA
10 -0.861 NA
...
df <- data.frame(x = rnorm(20))
while(any(df < 0)) {
cond <- df < 0
df[cond] <- df[cond] + 0.25
df[!cond] <- 1
}
df[df > 0] <- NA