从zoo :: rollmean的结果中替换NA值

时间:2017-06-14 14:18:41

标签: r

我最近正在处理一个数据,其中一部分显示如下。

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中的数据操作是不是逐行执行的?非常感谢你提前。

2 个答案:

答案 0 :(得分:0)

我有办法按照自己的意愿提供结果。 rollmean似乎无能为力,因为width(k)在群组中不可更改。 我使用了pracma::movavgdplyr。 这是代码:

adcc_final_temp1 <- adcc_final_temp1 %>% group_by(SID1A)%>% 
                    mutate(adcc_av30 = movavg(ladcc, min(30, length(ladcc)-1), type = 's'))

它类似于原始的,只是不同的功能/包。

答案 1 :(得分:0)

rollapplyrpartial = 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)