【发布时间】:2014-07-30 16:04:23
【问题描述】:
我正在尝试计算数据框值的百分比变化。现在,用户输入了必须计算百分比变化的行。如果用户输入 2,那么将计算每第二行的百分比变化。我有以下功能:
change <- function(DF, change) {
numCols <- ncol(DF)
for (i in 1: numCols) {
pctChange <-rep(NA,nrow(DF))
x<-DF[,i]
y<-c(DF[(change+1):nrow(DF),i], rep(NA,change))
pctChange <-round((y-x)*100/x,2)
DF$pct<-pctChange
colnames(DF)[ncol(DF)]<-paste(colnames(DF[i]),"pctChangeby",
change,sep = "")
}
return (DF)
}
当我测试这个功能时:
change(mtcars[1:5], 1)
我得到以下输出: (仅显示第一行的输出:
mpg mpgpctChangeby1
Mazda RX4 22.8 7.02
Mazda RX4 Wag 24.4 -6.56
Datsun 710 22.8 42.11
Hornet 4 Drive 32.4 -6.17
预期输出:
mpg mpgpctChangeby1
Mazda RX4 22.8 NA
Mazda RX4 Wag 24.4 7.02
Datsun 710 22.8 -6.56
Hornet 4 Drive 32.4 42.11
对于更改 = 2,
预期输出:
mpg mpgpctChangeby2
Mazda RX4 21.0 NA
Mazda RX4 Wag 21.0 NA
Datsun 710 22.8 8.57
Hornet 4 Drive 21.4 1.90
Hornet Sportabout 18.7 -17.98
【问题讨论】:
-
检查 x 和 y 的长度。它应该是不同的。使用
print(x); print(y)。在我评论 (#) 一些代码行后,更改(mtcars[1:5],1) [1] 32 [1] 33 [1] 32 [1] 33 [1] 32 [1] 33 [1 ] 32 [1] 33 [1] 32 [1] 33 -
我试图解决这个问题的另一种方法是:创建一个新的 data.frame 行数 = nrow(DF) 和列数作为结果的列数。
df[,i] <- c(NA,diff(DF[,i]) / head(DF[,i],n-1))但这只能在函数中输入 'change' 为 1 时使用。 -
在注意到您的评论后,我刚刚删除了我的解决方案。如果您将所需的输出发布到 mtcars 的第一列 for change=2 会更好。
-
@akrun,我已经编辑了帖子。我修复了之前的问题。你能看一下吗。谢谢
标签: r