嗨,有没有一种方法可以编码我想要的最小值?

时间:2020-06-29 16:19:37

标签: r

我的数据如下:

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

有没有办法对此进行编码,而无需进行硬编码?这是数据框格式

2 个答案:

答案 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)

如果年份avemin,则可以对每种 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,]