2012-04-25 60 views
4

我想复制一些我在Excel中使用R做的建模。我已经将数据从csv文件读入数据框。 csv文件包含两列数据ABExcel像R数据框中的列操作

我现在要添加额外的列ÇdË到数据帧,并与由在前面的列将公式应用于所述数据产生的数据来填充新的列C,d和E 。

下段应明确希望我想要做的事:

 A  B  C     D    E 
1 100.5 101.3 
2 102.6 102.5 
3 107.2 109.3 
4 99.3 89.3 
5 102.8 100.7  =(B5-B1)*A5   = C5   = IF(D5 >100,1,-1) 
6 107.2 98.9  =(B6-B2)*A6   = C6+C5  = IF(D6 >100,1,-1) 
7 99.8 109.9  =(B7-B3)*A7   = C7+C6  = IF(D7 >100,1,-1) 
8 108.2 99.5  =(B8-B4)*A8   = C8+C7  = IF(D8 >100,1,-1) 
9 78.7 89.6  =(B9-B5)*A9   = C9+C8  = IF(D9 >100,1,-1) 
10 108.9 109.2  =(B10-B6)*A10  = C10+C9  = IF(D10 >100,1,-1) 

我怎么能复制这样的“柱状”函数式编程是Excel文件(啊哈 - 擅长)在 - 使用R'

+11

C:'diff',D:'cumsum',E:'ifelse'。 – 2012-04-25 22:12:43

+3

@JoshuaUlrich给了你答案。从你的问题中,我建议你开始使用基本的R教程,并学习R“认为的方式”。它比Excel更强大,但是不同的隐喻。 – 2012-04-25 22:51:32

+0

@ gsk3:多数民众赞成只是问题。我似乎找不到任何解释/列出R隐喻或“R方式”做事的书。到目前为止,我所看到的任何事情都只是关于事情如何完成的一个介绍 - 而不是为什么他们这样做(或者背后的想法 - 以及为什么采取这种方法)。其他语言(例如Python)具有解决问题的独特方法,有文档解释推理(比如PEP标准)。 AFAIK,没有什么像R的 - 这让我很难在R中做任何复杂的事情。你能推荐一个链接/书吗? – 2012-04-26 08:06:31

回答

9

我的大脑在抗议下这样做。这让我觉得我回到了Minitab会议。

dfrm$C <- NA 
dfrm$C[5:10] <- with(dfrm, (B[5:10]-B[1:6])*A[5:10]) 
dfrm$D <- NA 
dfrm$D[5:10] <- cumsum(dfrm$C[5:10]) 
dfrm$E <- NA 
dfrm$E[5:10] <- 1 - 2*(dfrm$D[5:10] <= 100) # could also use ifelse() 

dfrm 
     A  B  C  D E 
1 100.5 101.3  NA  NA NA 
2 102.6 102.5  NA  NA NA 
3 107.2 109.3  NA  NA NA 
4 99.3 89.3  NA  NA NA 
5 102.8 100.7 -61.68 -61.68 -1 
6 107.2 98.9 -385.92 -447.60 -1 
7 99.8 109.9 59.88 -387.72 -1 
8 108.2 99.5 1103.64 715.92 1 
9 78.7 89.6 -873.57 -157.65 -1 
10 108.9 109.2 1121.67 964.02 1 
+0

'C'步骤可能是'diff(B,lag = 5)* A [5:10]'以配合Joshua的评论。 +1为minitab! – Justin 2012-04-25 23:36:05

+0

同意。这将更“功能性”。 ...至少在形式上,但你有检查语义? – 2012-04-26 00:28:50

+0

@DWin:感谢您的摘录。根据您的评论以及其他一些人的评论,这样做有更多的“以R为中心”的方式。你能不能添加几行来显示这样做的建议(即'R'方式)? – 2012-04-26 10:44:15

1

我创建下面的正确的解决方案通过结合双方BondedDust和贾斯汀提供给我的解决方案的答案:

A <- c(100.5, 102.6, 107.2, 99.3, 102.8, 107.2, 99.8, 108.2, 78.7, 108.9) 
B <- c(101.3, 102.5, 109.3, 89.3, 100.7, 98.9, 109.9, 99.5, 89.6, 109.2) 
dfexcel <- data.frame(A, B, C = rep_len(NA, 10), D = rep_len(NA, 10), E = rep_len(NA, 10)) 
dfexcel$C[5:10] <- with(dfexcel, diff(B, lag=4)*A[5:10]) 
dfexcel$D[5:10] <- with(dfexcel, (C[5:10]+c(0,C[5:9]))) # cumsum doesn't work for D 
dfexcel$E[5:10] <- ifelse(dfexcel$D[5:10] > 100, 1, -1) 

这是结果的LibreOffice Calc中/ Gnumeric电子/ Microsoft Excel中的/ etc:

A B C D E 
1 100.5 101.3   
2 102.6 102.5   
3 107.2 09.3    
4 99.3 89.3    
5 102.8 100.7 -61.68 -61.68 -1 
6 107.2 98.9 -385.92 -447.6 -1 
7 99.8 109.9 59.88 -326.04 -1 
8 108.2 99.5 1103.64 1163.52 1 
9 78.7 89.6 -873.57 230.07 1 
10 108.9 109.2 1121.67 248.1 1