我的数据如下:
Year Type Amount
2013 A 100
2013 B 150
2013 C 100
2013 D 300
2014 A 200
2014 B 150
2014 C 170
2014 D 100
2014 E 120
2015 A 100
2015 B 350
2015 C 670
2015 D 300
2015 E 220
我只想提取每种类型(A,B,C,D,E)的最早和最近的年份 如图所示,E的最早年份从2014年开始,而不是2013年。
我想要的输出将如下所示:
Year Type Amount
2013 A 100
2013 B 150
2013 C 100
2013 D 300
2014 E 120
2015 A 100
2015 B 350
2015 C 670
2015 D 300
2015 E 220
有没有办法对此进行编码,而无需进行硬编码?这是数据框格式
答案 0 :(得分:1)
使用dplyr
可以按Type
分组并选择Year,条件是每个Year
的最小值或最大值Type
library(dplyr)
df %>%
group_by(Type) %>%
filter(Year == min(Year) | Year == max(Year))
给我们:
Year Type Amount
<int> <chr> <int>
1 2013 A 100
2 2013 B 150
3 2013 C 100
4 2013 D 300
5 2014 E 120
6 2015 A 100
7 2015 B 350
8 2015 C 670
9 2015 D 300
10 2015 E 220
为进行跟进,计算增长百分比:
df %>%
group_by(Type) %>%
filter(Year == min(Year) | Year == max(Year)) %>%
arrange(Type) %>%
mutate(pct_change = (Amount[Year == max(Year)]/Amount[Year == min(Year)] - 1)*100)
给我们:
Year Type Amount pct_change
<int> <chr> <int> <dbl>
1 2013 A 100 0
2 2015 A 100 0
3 2013 B 150 133.
4 2015 B 350 133.
5 2013 C 100 570
6 2015 C 670 570
7 2013 D 300 0
8 2015 D 300 0
9 2014 E 120 83.3
10 2015 E 220 83.3
答案 1 :(得分:0)
如果年份是ave
或min
,则可以对每种 Type 使用max
测试:
x[ave(x$Year, x$Type, FUN=function(y) y==min(y) | y==max(y))==1,]
# Year Type Amount
#1 2013 A 100
#2 2013 B 150
#3 2013 C 100
#4 2013 D 300
#9 2014 E 120
#10 2015 A 100
#11 2015 B 350
#12 2015 C 670
#13 2015 D 300
#14 2015 E 220
或使用range
和%in%
x[ave(x$Year, x$Type, FUN=function(y) y %in% range(y))==1,]