首页 > 解决方案 > 如何添加具有特定计算的列并根据 R 中的计算绘制图表?

问题描述

例如,我有以下数据集:

timestamp  open    close    ID    
2000       1000    1100     5
2060       1100    1150     5
2120       1150    1200     5
2180       1200    1150     5
2240       1150    1100     8
2300       1100    1000     8
2360       1000    950      8
2420       950     900      8
2480       900     950      5
2540       950     1000     5
2600       1000    1050     5
2660       1050    1100     4
2720       1100    1150     4
2780       1150    1200     4

如何添加另一个显示特定 ID 出现次数的列,这由 显示Number_ID?以及如何添加另一列,该列给出自新 ID 开始以来的百分比变化。第一个打开是 ID 的开始,我们使用关闭来计算%_change. 所以这看起来像这样(因为不必包括计算,我添加了它以便您可以看到计算):

timestamp  open    close    ID   Number_ID    %_change  
2000       1000    1100     5    1            10 (because (1100-1000)*100/1000)
2060       1100    1150     5    2            15 (because (1150-1000)*100/1000)
2120       1150    1200     5    3            20 (because (1200-1000)*100/1000)
2180       1200    1150     5    4            15 (because (1150-1000)*100/1000)
2240       1150    1100     8    1            -4 (because (1100-1150)*100/1150)
2300       1100    1000     8    2            -13 (because (1000-1150)*100/1150)
2360       1000    950      8    3            -17 (because (950-1150)*100/1150)
2420       950     900      8    4            -21 (because (900-1150)*100/1150)
2480       900     950      5    1            5 (because (950-900)*100/900)
2540       950     1000     5    2            11 (because (1000-900)*100/900)
2600       1000    1050     5    3            16 (because 1050-900)*100/900)
2660       1050    1100     4    1            4 (because (1100-1050)*100/1050)
2720       1100    1150     4    2            9  (because (1150-1050)*100/1050)
2780       1150    1200     4    3            14 (because (1200-1050)*100/1050)

当有这 2 列时,如何制作一个图表来绘制每个 ID 的最高正负百分比变化?因此,我首先需要添加一个计算方法,以计算ID的open和之间的价格差异百分比。close这看起来像这样:

timestamp  open    close    ID   Number_ID    %_change    %_change_opencloseID
2000       1000    1100     5    1            10          
2060       1100    1150     5    2            15 
2120       1150    1200     5    3            20 
2180       1200    1150     5    4            15          15 (because (1150-1000)*100/1000)
2240       1150    1100     8    1            -4 
2300       1100    1000     8    2            -13 
2360       1000    950      8    3            -17 
2420       950     900      8    4            -21         -21 (because (900-1150)*100/1150)
2480       900     950      5    1            5 
2540       950     1000     5    2            11 
2600       1000    1050     5    3            16           16 (because (1050-900)*100/900)
2660       1050    1100     4    1            4 
2720       1100    1150     4    2            9  
2780       1150    1200     4    3            14           14 (because (1200-1050)*100/1050)

如果我有这个,我怎样才能制作一个图表来自动绘制 ID 5 的 16% 变化而不是 ID 5 的 15% 变化?在timestampx 轴和%_changey 轴上。

谢谢!

标签: rdataframeggplot2percentage

解决方案


这就是你如何做你的第一步:

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(Number_ID  = row_number(), 
         perc_change = (close - first(open))/first(open) * 100)


#  timestamp  open close    ID Number_ID perc_change
#       <int> <int> <int> <int>     <int>       <dbl>
# 1      2000  1000  1100     5         1       10   
# 2      2060  1100  1150     5         2       15   
# 3      2120  1150  1200     5         3       20   
# 4      2180  1200  1150     5         4       15   
# 5      2240  1150  1100     8         1       -4.35
# 6      2300  1100  1000     8         2      -13.0 
# 7      2360  1000   950     8         3      -17.4 
# 8      2420   950   900     8         4      -21.7 
# 9      2480   900   950     5         5       -5   
#10      2540   950  1000     5         6        0   
#11      2600  1000  1050     5         7        5   
#12      2660  1050  1100     4         1        4.76
#13      2720  1100  1150     4         2        9.52
#14      2780  1150  1200     4         3       14.3 

data.table

library(data.table)
setDT(df)[, c("Number_ID", "perc_change") := list(seq_len(.N), 
           (close - first(open))/first(open) * 100), ID]

推荐阅读