特定行号的标准偏差,并将该值放在另一行& R中的专栏

时间:2016-07-07 16:36:56

标签: r standard-deviation

我有以下数据:

Date                 Value          Std.Dev
11/30/2015 10:00     0  
11/30/2015 10:30    -0.002400962    
11/30/2015 11:00    -0.004819286    
11/30/2015 11:30    -0.000805477    
11/30/2015 12:00    -0.001612904    
11/30/2015 12:30    -0.003233633    
11/30/2015 13:00     0.000809389    
11/30/2015 13:30     0.005647453    
11/30/2015 14:00    -0.002416433    
11/30/2015 14:30    -0.006472515    
11/30/2015 15:00    -0.002438035    
11/30/2015 15:30     0  
11/30/2015 16:30    -0.000814001    
12/1/2015 9:00       0.006493529    0.002931114
12/1/2015 9:30      -0.001619434    0.003657839
12/1/2015 10:00     -0.003246756    0.00363798
12/1/2015 10:30     -0.002442004    0.003519869
12/1/2015 11:00      0.000814664    0.003551266
12/1/2015 11:30     -0.001629992    0.00357286
12/1/2015 12:00      0.000815328    0.003504601
12/1/2015 12:30     -1.11022E-16    0.003504796
12/1/2015 13:00     -0.000815328    0.002981979

Std.Dev应该从row number 14开始计算。因为我正在计算前几天的第一个std.dev值。 standard deviation for row 14row=1计算价值的row=13Std.Dev_at_row_number_15 = STDEV(Value2:Value14)因此它应该继续下去。所以Std.Dev_at_row_number_16 = STDEV(Value3:Value15)package sp; import com.ib.client.Contract; import com.ib.client.EClientSocket; import com.ib.client.EWrapper; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class SP { //just a sample, like this so you can just use Files.lines instead. private static List<String> lines = Arrays.asList(new String[]{ "Symbol,Name,Sector", "MMM,3M Company,Industrials", "ABT,Abbott Laboratories,Health Care", "ABBV,AbbVie,Health Care", "ACN,Accenture plc,Information Technology", "ATVI,Activision Blizzard,Information Technology", "AYI,Acuity Brands Inc,Industrials", "ADBE,Adobe Systems Inc,Information Technology", "AAP,Advance Auto Parts,Consumer Discretionary", "AES,AES Corp,Utilities", "AET,Aetna Inc,Health Care", "AMG,Affiliated Managers Group Inc,Financials", "AFL,AFLAC Inc,Financials", "A,Agilent Technologies Inc,Health Care", "APD,Air Products & Chemicals Inc,Materials", "AKAM,Akamai Technologies Inc,Information Technology", }); public static void main(String[] args) throws InterruptedException{ EWrapper wrapper = new Wrapper(); EClientSocket socket = new EClientSocket(wrapper); socket.eConnect("", 4001, 123); //supposedly gives frozen last recorded value, not working! socket.reqMarketDataType(2); AtomicInteger tickerId = new AtomicInteger(0); lines.stream().skip(1).forEach(line -> { //new cont for every request Contract cont = new Contract(); cont.m_currency = "usd"; cont.m_exchange = "smart"; cont.m_secType = "stk"; cont.m_symbol = line.split(",")[0]; Data data = new Data(cont, socket); }); //need you own logic for when to end program //Thread.sleep(5000);//this thread, Socket starts a reader thread //socket.eDisconnect(); } } 。等等......

你可以在R中为这种计算建议任何函数。在excel中它很容易。但如果你能在R中建议相似,那将非常有帮助。

感谢。

请原谅我的英语不好(如果有的话)。如果您需要更多详细信息或示例,请在评论中告诉我。

2 个答案:

答案 0 :(得分:1)

绝对不是最有效的方式,但也许对你来说足够了(用x表示你的数据框):

    for(counter in 14:nrow(x)){
       x[counter,3] <- sd(x[(counter-13):(counter-1),2])
    }

但同样,这绝对不是最有效的方法。

答案 1 :(得分:0)

对于data.frame,df,您可以使用sapply

进行以下操作
df$st.dev <- c(rep(NA, 13), sapply(13:(nrow(df)-1), function(i) sd(df$Value[(i-12):i])))

sapply将遍历选定的行,后面的函数将重复计算所选行的标准偏差。我将NAs添加到此输出中,以便可以将其添加到data.frame。

数据

我在阅读数据时作了一点欺骗,但这并没有影响结果。

df <- read.table(header=T, text="Date   Time      Value         
11/30/2015 10:00     0  
11/30/2015 10:30    -0.002400962    
11/30/2015 11:00    -0.004819286    
11/30/2015 11:30    -0.000805477    
11/30/2015 12:00    -0.001612904    
11/30/2015 12:30    -0.003233633    
11/30/2015 13:00     0.000809389    
11/30/2015 13:30     0.005647453    
11/30/2015 14:00    -0.002416433    
11/30/2015 14:30    -0.006472515    
11/30/2015 15:00    -0.002438035    
11/30/2015 15:30     0  
11/30/2015 16:30    -0.000814001    
12/1/2015 9:00       0.006493529   
12/1/2015 9:30      -0.001619434   
12/1/2015 10:00     -0.003246756   
12/1/2015 10:30     -0.002442004   
12/1/2015 11:00      0.000814664   
12/1/2015 11:30     -0.001629992   
12/1/2015 12:00      0.000815328   
12/1/2015 12:30     -1.11022E-16   
12/1/2015 13:00     -0.000815328", as.is=TRUE, row)