我想按行在我的数据中的列之间进行计算。计算是"移动"因为我想知道第1列和第2列中两个数字之间的区别,然后是第3列和第4列,依此类推。我看过"循环"和" rollapply"功能,但无法弄清楚这一点。以下是尝试的三个选项。只有第三个选项给了我后面的结果,但它是非常冗长的代码,也不允许自动化(输入数据将是一个更大的矩阵,因此键入每行的计算不会工作)。 请建议如何缩短此代码和/或任何其他软件包/函数来检查哪些代码可以完成工作。谢谢!
样本数据集
a<- c(1,2,3, 4, 5)
b<- c(1,2,3, 4, 5)
c<- c(1,2,3, 4, 5)
test.data <- data.frame(cbind(a,b*2,c*10))
names(test.data) <- c("a", "b", "c")
尝试的计算样本:
选项1
require(zoo)
rollapply(test.data, 2, diff, fill = NA, align = "right", by.column=FALSE)
结果1(不是我们之后的事情。我们需要的是选项3的底部)
# a b c
#[1,] NA NA NA
#[2,] 1 2 10
#[3,] 1 2 10
#[4,] 1 2 10
#[5,] 1 2 10
选项2:
results <- for (i in 1:length(nrow(test.data))) {
diff(as.numeric(test.data[i,]), lag=1)
print(results)}
结果2 :(再次不是我们之后的事情)
# NULL
选项3:工作,但很长的路要走,所以我希望简化代码并为我的数据框和任意数量的列(即3个以上)中的任何长度的观察做一些通用。我想&#34;自动化&#34;如果知道观察次数(即行数),则执行以下步骤。
row1=diff(as.numeric(test[1,], lag=1))
row2=diff(as.numeric(test[2,], lag=1))
row3=diff(as.numeric(test[3,], lag=1))
row4=diff(as.numeric(test[4,], lag=1))
row5=diff(as.numeric(test[5,], lag=1))
results.OK=cbind.data.frame(row1, row2, row3, row4, row5)
transpose.results.OK=data.frame(t(as.matrix(results.OK)))
names(transpose.results.OK)=c("diff.ab", "diff.bc")
Final.data = transpose.results.OK
print(Final.data)
结果3 :(这就是我想要得到的东西,&#34;第1行和第34行;可以是&#34; obs1&#34;等等)
# diff.ab diff.bc
#row1 1 8
#row2 2 16
#row3 3 24
#row4 4 32
#row5 5 40
结束
答案 0 :(得分:3)
以下是重做的3个选项加上第4个选项:
# 1
library(zoo)
d <- t(rollapplyr(t(test.data), 2, diff, by.column = FALSE))
# 2
d <- test.data[-1]
for (i in 1:nrow(test.data)) d[i, ] <- diff(unlist(test.data[i, ]))
# 3
d <- t(diff(t(test.data)))
# 4 - also this works
nc <- ncol(test.data)
d <- test.data[-1] - test.data[-nc]
任何人都要设置名称:
colnames(d) <- paste0("diff.", head(names(test.data), -1), colnames(d))
(2)和(4)给出这个data.frame和(1)和(3)给出相应的矩阵:
> d
diff.ab diff.bc
1 1 8
2 2 16
3 3 24
4 4 32
5 5 40
如果您想要另一个,请使用as.matrix
或as.data.frame
。
答案 1 :(得分:0)
在行方式上使用apply
的基于diff
的解决方案可以实现为:
# Result
res <- t(apply(test.data, 1, diff)) #One can change it to data.frame
# Name of the columns
colnames(res) <- paste0("diff.", head(names(test.data), -1),
tail(names(test.data), -1))
res
# diff.ab diff.bc
# [1,] 1 8
# [2,] 2 16
# [3,] 3 24
# [4,] 4 32
# [5,] 5 40