全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1199 5
2018-04-22
各位大大好,

假如 df 有以下数据,


index

name

amount

1

A

10

2

B

14

3

C

3

4

A

4

5

A

15

6

C

9

7

B

12

8

B

8

8

C

6

9

A

7

10

B

8

11

C

10

12

A

13

13

B

14

14

C

8

15

A

12

16

C

9

17

A

6

18

C

10

19

A

3



df <- data.frame(index = 1:20, name = c("A", "B", "C", "A", "A", "C", "B", "C", "A", "B", "C", "A", "A", "A", "C", "B", "C", "A", "B", "C"), amount = c(10,14,3,4,15,9,12,6,7,8,10,13,12,6,8,8,9,3,14,10))

index

name

amount

last3avg

1

A

10

NA

2

B

14

NA

3

C

3

NA

4

A

4

NA

5

A

15

9.667

6

C

9

NA

7

B

12

NA

8

B

8

11.333

8

C

6

6.000

9

A

7

8.667

10

B

8

9.333

11

C

10

8.333

12

A

13

11.667

13

B

14

10.000

14

C

8

8.000

15

A

12

10.667

16

C

9

9.000

17

A

6

10.333

18

C

10

9.000

19

A

3

7.000



如何計出, A,B,C "近三次"平均amount, 不足3次出na值

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2018-4-22 15:48:00
这个是 moving average 的内容吧

install.packages('TTR')
library(dplyr)
library(TTR)

df <- data.frame(index = 1:20, name = c("A", "B", "C", "A", "A", "C", "B", "C", "A", "B", "C", "A", "A", "A", "C", "B", "C", "A", "B", "C"), amount = c(10,14,3,4,15,9,12,6,7,8,10,13,12,6,8,8,9,3,14,10))

all_data=data.frame()
for (a in unique(df$name)){
data=df%>%filter(name==a)%>%mutate(last3avg=runMean(amount, n = 3, cumulative = FALSE))  
all_data=rbind(data,all_data)
}

all_data=all_data%>%arrange(index)
all_data
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-4-22 15:53:04
微信图片_20180422161041.png
附件列表
微信图片_20180422155217.png

原图尺寸 42.68 KB

微信图片_20180422155217.png

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-4-22 16:21:45
感謝 rainningpoet 兄的回答, 效果是我想要的, 謝謝.

另外, 亦多謝jinkelazzz兄在EXCEL 的見解,
我提問沒有說清楚是用 R, 真不好意思, 但十分多謝熱心的前輩
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-5-1 23:39:26
rainningpoet 兄,

df <- data.frame(index = 1:20, name = c("A", "B", "C", "A", "A", "C", "B", "C", "A", "B", "C", "A", "A", "A", "C", "B", "C", "A", "B", "D"), amount = c(10,14,3,4,15,9,12,6,7,8,10,13,12,6,8,8,9,3,14,10))

如果我name第20項, 改為"D", 你的公式就沒法远作了, 請問有其他解決方法嗎 ?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-5-2 00:31:20
因为D不够3位。

library(dplyr)
library(TTR)

df <- data.frame(index = 1:20, name = c("A", "B", "C", "A", "A", "C", "B", "C", "A", "B", "C", "A", "A", "A", "C", "B", "C", "A", "B", "D"),
                 amount = c(10,14,3,4,15,9,12,6,7,8,10,13,12,6,8,8,9,3,14,10))


all_data=data.frame()
for (a in unique(df$name)){
  if (nrow(df%>%filter(name==a))<3){
  data=df%>%filter(name==a)%>%mutate(last3avg=NA)
  }else{
  data=df%>%filter(name==a)%>%mutate(last3avg=runMean(amount, n = 3, cumulative = FALSE))
  }
  all_data=rbind(data,all_data)
}

all_data=all_data%>%arrange(index)
all_data
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群