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

罗宾·赫普

我是R语言的一个新手,因此被插入一个需要大量R语言技能的项目中。因此,即使我正在上R类,我也已经在寻找一种在每个公司的data.frame上循环百分比更改公式(T-(T-1))/ T-1的方法。

初始数据框的外观如何。请注意,这是一个示例数据集,然后将代码修改为nrow和ncolumn data.frame:

在此处输入图片说明

创建此初始数据帧的代码为:

company <- c("Aa", "Bb", "Cc", "Dd") 
sector <- c("B", "A", "E", "Z") 
lastmarketcap <- c(18, 4571, 122, 239) 
X200201 <- c(12, 4567, 121, 234) 
X200202 <- c(13, 4568, 121, 236) 
X200203 <- c(16, 4568, 122, 237) 
X200204 <- c(18, 4571, 122, 239) 

databasis <- data.frame(company, sector, lastmarketcap, X200201, X200202, X200203, X200204) 

最终的data.frame应该看起来像:

在此处输入图片说明

预先感谢您的帮助!

再次

您的列名在语法上无效。这是一个有效的数据框,是一种执行所需操作的方法:

解决方案:

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章