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 行
如果我理解正确的话,这就是你想要的:
\n\ndf %>% \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\nRun Code Online (Sandbox Code Playgroud)\n
以下是如何使用dplyr和roll_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)