我有一个这样的数据帧,它是由变量的累加产生的:
id v1 v2 v3
1 4 5 9
2 1 1 4
我想了解各列之间的差异,例如将数据帧转换为:
id v1 v2 v3
1 4 1 4
2 1 0 3
如此有效地“去累加”得到的差值。这是原始df约有150列的一个小例子。
谢谢!
答案 0 :(得分:0)
x <- read.table(header=TRUE, text="
id v1 v2 v3
1 4 5 9
2 1 1 4")
x[,c("v1","v2","v3")] <- cbind(x[,"v1"], t(apply(x[,c("v1","v2","v3")], 1, diff)))
x
# id v1 v2 v3
# 1 1 4 1 4
# 2 2 1 0 3
说明:
在前面,请注意:在apply
上使用data.frame
时,它将参数转换为matrix
。这意味着如果传递给character
的参数中有apply
列,则整个矩阵将为character
,可能不是您想要的。因此,仅选择所需的列(并专门重新分配它们)会更安全。
apply(.., MARGIN=1, ...)
以与预期相反的方向返回其输出,因此我必须将其包装在t(...)
中。
我正在使用diff
,它返回一个长度比输入短一的向量,所以我正在cbind
将原始列返回到t(apply(...))
的返回值
就像我必须确定要传递给apply
的列一样,我同样也要确定将哪些列替换为返回值。
答案 1 :(得分:0)
简单的循环可能会解决问题,但是对于较大的数据,它将比其他方法慢。
df <- data.frame(id = c(1,2), v1 = c(4,1), v2 = c(5,1))
df2 <- df
for(i in 3:ncol(df)){
df2[,i] <- df[,i] - df[,i-1]
}