使用 dplyr 计算自定义函数第 n 行

War*_*arz 2 statistics r dataframe dplyr

给定以下数据框:

A   B        C       D
1   92.44   14261   13183
2   92.43   14244   13166
3   94.24   14730   13882
4   97.42   12149   11836
5   94.75   14431   13674
6   95.91   11038   10587
7   95.66   14886   14240
8   94.94   12587   11950
9   94.27   13251   12492
10  94.89   12789   12135
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 R 创建rowwise计算,该计算允许我对C 列和 D 列中的summarize()4行进行相应划分,并将其替换为下一行。

replace(nth row + 1) = SUM(C) / SUM(D)
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的

df %>% mutate(B=replace(mpB, nrow(4)=summarise(C/D), NA))   
Run Code Online (Sandbox Code Playgroud)

所需输出

A   B        C      D
1   92.44   14261   13183
2   92.43   14244   13166
3   94.24   14730   13882
4   97.42   12149   11836
5   94.01   14431   13674
6   95.91   11038   10587
7   95.66   14886   14240
8   94.94   12587   11950
9   94.27   13251   12492
10  95.18   12789   12135
Run Code Online (Sandbox Code Playgroud)

*使用所需的计算更新第 5 行和第 10 行

Sca*_*bee 6

如果我理解正确的话,这就是你想要的:

\n\n
df %>% \n  mutate(group5 = (1:n() - 1) %/% 5) %>% # (using eipi10's method)\n  group_by(group5) %>% \n  mutate(B = ifelse(row_number() == 5, # update only 5th row of each group\n                    round(100 * sum(D[1:4]) / sum(C[1:4]), 2), \n                    B)) %>% \n  ungroup %>% \n  select(-group5)\n# # A tibble: 10 \xc3\x97 4\n#        A     B     C     D\n#    <int> <dbl> <int> <int>\n# 1      1 92.44 14261 13183\n# 2      2 92.43 14244 13166\n# 3      3 94.24 14730 13882\n# 4      4 97.42 12149 11836\n# 5      5 94.01 14431 13674\n# 6      6 95.91 11038 10587\n# 7      7 95.66 14886 14240\n# 8      8 94.94 12587 11950\n# 9      9 94.27 13251 12492\n# 10    10 95.18 12789 12135\n
Run Code Online (Sandbox Code Playgroud)\n


Pie*_*nte 5

以下是如何使用dplyrroll_sumrfrom执行此操作RcppRoll。您可以每 5 周使用ifelse一次mutateB 列。为此,您可以使用A %% 5A 列除以 5 的模数。当它为 0 时,您可以对前四个星期求和,并根据要求除 D/C。lag(roll_sumr(D,4)/roll_sumr(C,4)*100)

library(dplyr);library(RcppRoll)
df%>%
  mutate(B=ifelse(A %% 5 ==0,
                  lag(roll_sumr(D,4)/roll_sumr(C,4)*100),
                  B))

    A        B     C     D
1   1 92.44000 14261 13183
2   2 92.43000 14244 13166
3   3 94.24000 14730 13882
4   4 97.42000 12149 11836
5   5 94.01091 14431 13674
6   6 95.91000 11038 10587
7   7 95.66000 14886 14240
8   8 94.94000 12587 11950
9   9 94.27000 13251 12492
10 10 95.18373 12789 12135
Run Code Online (Sandbox Code Playgroud)

数据

df <- read.table(text="A   B        C       D
                 1   92.44   14261   13183
                 2   92.43   14244   13166
                 3   94.24   14730   13882
                 4   97.42   12149   11836
                 5   94.75   14431   13674
                 6   95.91   11038   10587
                 7   95.66   14886   14240
                 8   94.94   12587   11950
                 9   94.27   13251   12492
                 10  94.89   12789   12135",header=TRUE,stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)