注意:使用示例数据框进行修改以提高可读性。
假设我有以下数据框df
GRID FLOW NITER tau eta psi
67 0 87 66001 0.6571 0.9050 0.5947
68 0 87 67001 0.6571 0.9050 0.5947
69 0 87 68001 0.6571 0.9050 0.5947
70 0 87 69001 0.6572 0.9050 0.5947
71 0 87 70001 0.6571 0.9050 0.5947
72 0 87 71001 0.6572 0.9050 0.5947
73 0 87 72001 0.6571 0.9050 0.5947
74 0 87 73001 0.6571 0.9050 0.5947
75 0 87 74001 0.6571 0.9050 0.5947
207 1 87 66001 0.6539 0.9001 0.5886
208 1 87 67001 0.6539 0.9001 0.5886
209 1 87 68001 0.6539 0.9001 0.5886
210 1 87 69001 0.6539 0.9001 0.5886
277 2 87 66001 0.6573 0.9031 0.5935
278 2 87 67001 0.6573 0.9031 0.5935
279 2 87 68001 0.6573 0.9031 0.5935
280 2 87 69001 0.6573 0.9031 0.5935
347 3 87 66001 0.6575 0.9020 0.5930
348 3 87 67001 0.6575 0.9020 0.5930
349 3 87 68001 0.6575 0.9020 0.5930
350 3 87 69001 0.6575 0.9020 0.5930
627 7 87 66001 0.6573 0.9020 0.5929
628 7 87 67001 0.6573 0.9020 0.5929
629 7 87 68001 0.6573 0.9020 0.5929
630 7 87 69001 0.6573 0.9021 0.5929
631 7 87 70001 0.6573 0.9021 0.5929
632 7 87 71001 0.6573 0.9021 0.5929
633 7 87 72001 0.6573 0.9021 0.5929
634 7 87 73001 0.6573 0.9021 0.5929
635 7 87 74001 0.6573 0.9021 0.5929
GRID
变量和NITER
变量是整数。如您所见,对于GRID
的某些值(本例中为1,2和3),NITER
的最大值为69001.对于GRID
的其他值(0和7)在这个例子中),最大NITER
高于69001.对于所有这些组,我需要用NITER
< 69001,并将70000减去其他观测值的NITER
值。我可以使用for
循环执行此操作,但R中的循环速度很慢,因此我更喜欢更R风格的解决方案。
答案 0 :(得分:1)
dplyr
使用链接来提高可读性。如果你完全习惯了SQL,你应该会发现它非常有用。
手册也很好:https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html
因为我只猜测数据的结构,所以我只能对响应进行伪编码。同样,只有在按GRID
进行分组才能让您了解' clumps'您正在尝试调整NITER。
df1 <- df %>%
group_by(GRID) %>%
mutate(itermax=max(NITER),
NNITER=ifelse(itermax>69001L, NITER-70000L, NITER),
keep=NNITER > 0) %>%
filter(keep) %>%
select(GRID, FLOW, NNITER, tau, eta, psi)
> as.data.frame(df1)
GRID FLOW NNITER tau eta psi
1 0 87 1 0.6571 0.9050 0.5947
2 0 87 1001 0.6572 0.9050 0.5947
3 0 87 2001 0.6571 0.9050 0.5947
4 0 87 3001 0.6571 0.9050 0.5947
5 0 87 4001 0.6571 0.9050 0.5947
6 1 87 66001 0.6539 0.9001 0.5886
7 1 87 67001 0.6539 0.9001 0.5886
8 1 87 68001 0.6539 0.9001 0.5886
9 1 87 69001 0.6539 0.9001 0.5886
10 2 87 66001 0.6573 0.9031 0.5935
11 2 87 67001 0.6573 0.9031 0.5935
12 2 87 68001 0.6573 0.9031 0.5935
13 2 87 69001 0.6573 0.9031 0.5935
14 3 87 66001 0.6575 0.9020 0.5930
15 3 87 67001 0.6575 0.9020 0.5930
16 3 87 68001 0.6575 0.9020 0.5930
17 3 87 69001 0.6575 0.9020 0.5930
18 7 87 1 0.6573 0.9021 0.5929
19 7 87 1001 0.6573 0.9021 0.5929
20 7 87 2001 0.6573 0.9021 0.5929
21 7 87 3001 0.6573 0.9021 0.5929
22 7 87 4001 0.6573 0.9021 0.5929