我最近正在处理一个数据,其中一部分显示如下。
gcloud dataproc clusters create cluster_name --bucket="profiling-
job-default" \
--zone=europe-west1-c \
--master-boot-disk-size=500GB \
--worker-boot-disk-size=500GB \
--master-machine-type=n1-standard-16 \
--num-workers=10 \
--worker-machine-type=n1-standard-16 \
--initialization-actions gs://custom_init_gcp.sh \
--metadata MINICONDA_VARIANT=2 \
--properties=^--^yarn:yarn.scheduler.minimum-allocation-vcores=4--capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
我想要得到的是SID1A的ladcc的滚动平均宽度为3.所以我尝试了动物园中的rollmean函数和dplyr中的表达式。
SID1A day1 day2 pci TRTREG1C ladcc
1 1000_00001 0 1 0 A 98
2 1000_00001 1 2 0 A 95
3 1000_00001 2 3 0 A 94
4 1000_00001 3 4 0 A 99
5 1000_00001 4 5 0 A 97
6 1000_00002 0 1 0 B 98
7 1000_00002 1 2 0 B 94
8 1000_00002 2 3 0 B 97
9 1000_00002 3 4 0 B 96
10 1000_00003 0 1 0 A 101
11 1000_00003 1 2 0 A 99
12 1000_00004 0 1 0 B 89
13 1000_00004 1 2 0 B 88
它给我的结果如下。
dt <- dt %>% group_by(SID1A)%>%
mutate(adcc_av3 = rollmean(x=ladcc, min(3, length(ladcc)), partial = T,
na.pad = T, fill=NA, align = 'right'))
我想从结果中得到什么
SID1A day1 day2 pci TRTREG1C ladcc adcc_av30
1 1000_00001 0 1 0 A 98 NA
2 1000_00001 1 2 0 A 95 NA
3 1000_00001 2 3 0 A 94 95.66666667
4 1000_00001 3 4 0 A 99 96
5 1000_00001 4 5 0 A 97 96.66666667
6 1000_00002 0 1 0 B 98 NA
7 1000_00002 1 2 0 B 94 NA
8 1000_00002 2 3 0 B 97 96.33333333
9 1000_00002 3 4 0 B 96 95.66666667
10 1000_00003 0 1 0 A 101 NA
11 1000_00003 1 2 0 A 99 100
12 1000_00004 0 1 0 B 89 NA
13 1000_00004 1 2 0 B 88 88.5
哪个是 SID1A day1 day2 pci TRTREG1C ladcc adcc_av30
1 1000_00001 0 1 0 A 98 98
2 1000_00001 1 2 0 A 95 96.5
3 1000_00001 2 3 0 A 94 95.66666667
4 1000_00001 3 4 0 A 99 96
5 1000_00001 4 5 0 A 97 96.66666667
6 1000_00002 0 1 0 B 98 98
7 1000_00002 1 2 0 B 94 96
8 1000_00002 2 3 0 B 97 96.33333333
9 1000_00002 3 4 0 B 96 95.66666667
10 1000_00003 0 1 0 A 101 101
11 1000_00003 1 2 0 A 99 100
12 1000_00004 0 1 0 B 89 89
13 1000_00004 1 2 0 B 88 88.5
,我尝试了rollmean(ladcc, k = min(3, **number of rows before this row**))
,但它不起作用并且给了我“k&lt; = n不正确”的错误。那么dplyr中的数据操作是不是逐行执行的?非常感谢你提前。
答案 0 :(得分:0)
我有办法按照自己的意愿提供结果。 rollmean
似乎无能为力,因为width(k)
在群组中不可更改。
我使用了pracma::movavg
和dplyr
。
这是代码:
adcc_final_temp1 <- adcc_final_temp1 %>% group_by(SID1A)%>%
mutate(adcc_av30 = movavg(ladcc, min(30, length(ladcc)-1), type = 's'))
它类似于原始的,只是不同的功能/包。
答案 1 :(得分:0)
将rollapplyr
与partial = TRUE
library(zoo)
roll <- function(x) rollapplyr(x, 3, mean, partial = TRUE)
transform(DF, avg = ave(ladcc, SID1A, FUN = roll))
,并提供:
SID1A day1 day2 pci TRTREG1C ladcc avg
1 1000_00001 0 1 0 A 98 98.00000
2 1000_00001 1 2 0 A 95 96.50000
3 1000_00001 2 3 0 A 94 95.66667
4 1000_00001 3 4 0 A 99 96.00000
5 1000_00001 4 5 0 A 97 96.66667
6 1000_00002 0 1 0 B 98 98.00000
7 1000_00002 1 2 0 B 94 96.00000
8 1000_00002 2 3 0 B 97 96.33333
9 1000_00002 3 4 0 B 96 95.66667
10 1000_00003 0 1 0 A 101 101.00000
11 1000_00003 1 2 0 A 99 100.00000
12 1000_00004 0 1 0 B 89 89.00000
13 1000_00004 1 2 0 B 88 88.50000
注意:以可重现的形式使用的输入是:
Lines <- " SID1A day1 day2 pci TRTREG1C ladcc
1 1000_00001 0 1 0 A 98
2 1000_00001 1 2 0 A 95
3 1000_00001 2 3 0 A 94
4 1000_00001 3 4 0 A 99
5 1000_00001 4 5 0 A 97
6 1000_00002 0 1 0 B 98
7 1000_00002 1 2 0 B 94
8 1000_00002 2 3 0 B 97
9 1000_00002 3 4 0 B 96
10 1000_00003 0 1 0 A 101
11 1000_00003 1 2 0 A 99
12 1000_00004 0 1 0 B 89
13 1000_00004 1 2 0 B 88"
DF <- read.table(text = Lines, header = TRUE)