我是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] 删除。
我来说两句