如何通过R中的data.frame循环动态公式?

时间:2018-03-27 07:47:26

标签: r dataframe

我是R中的一个完整新手,我被插入到需要大量R技能的项目中。因此,即使我正在参加R课程,我也在寻找一种方法,在每个公司的data.frame上循环一个百分比变化公式(T-(T-1))/ T-1。

初始数据框的样子。请注意这是一个样本 数据集,代码然后将适应nrow和ncolumn data.frame:

enter image description here

创建此初始数据框的代码是:

.frame('your_id')

最终的data.frame应如下所示:

enter image description here

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的列名在语法上无效。这是一个有效的数据框架,也是一种做你想做的事情的方法:

解决方案:

m <- data.matrix(databasis[-(1:3)])
new <- cbind(databasis[1:3], (m[,2:4] - m[,1:3])/m[,1:3])
new
#   company sector lastmarketcap           Q2          Q3           Q4
# 1      Aa      B            18 0.0833333333 0.230769231 0.1250000000
# 2      Bb      A          4571 0.0002189621 0.000000000 0.0006567426
# 3      Cc      E           122 0.0000000000 0.008264463 0.0000000000
# 4      Dd      Z           239 0.0085470085 0.004237288 0.0084388186

如果您想变得聪明并制作可读且通用的解决方案,请首先定义一些简单的函数:

except_last <- function(m) m[,seq_len(ncol(m) - 1)]
except_first <- function(m) m[,seq.int(2, ncol(m))]

然后将其用于子集:

new <- cbind(databasis[1:3], 
             (except_first(m) - except_last(m))/except_last(m))
# produces the same new as above

上述情况将适用于您可能拥有的多年和几个季度。

数据:

company <- c("Aa", "Bb", "Cc", "Dd") 
sector <- c("B", "A", "E", "Z") 
lastmarketcap <- c(18, 4571, 122, 239) 
Q1 <- c(12, 4567, 121, 234) 
Q2 <- c(13, 4568, 121, 236) 
Q3 <- c(16, 4568, 122, 237) 
Q4 <- c(18, 4571, 122, 239) 

databasis <- data.frame(company = company, sector = sector, lastmarketcap = lastmarketcap, Q1 = Q1, Q2 = Q2, Q3 = Q3, Q4 = Q4)