原始数据框如下:
my.dataset1<- data.frame(site=c(11,12,13,14),
season=c(21,22,23,24),
PH=c(1,2,3,4))
然后我要的是下面的内容:如您所见,每个值都移动了一级:
my.dataset2<- data.frame(site=c(12,13,14,11),
season=c(22,23,24,21),
PH=c(2,3,4,1))
我尝试通过以下命令解决该问题:
w<-colnames(dataframe)
for (i in w) {
nrow(dataframe)
m<-seq(1,nrow(dataframe))
m[1:nrow(dataframe)-1]<-dataframe$i[2:nrow(dataframe)]
m[nrow(dataframe)]<-dataframe$i[1]
dataframe$i<-m
}
但是它不起作用。 然后我尝试通过尝试以下命令来修复它:
w<-colnames(dataframe)
for (i in w) {
print(dataframe$i)
}
我得到的东西如下:
NULL
NULL
NULL
答案 0 :(得分:0)
“将观察向前移动”也称为“滞后”或“移动”。您可以使用shift
中相当灵活的data.table
函数来完成此操作:
library(data.table)
my.dataset1<- data.frame(site=c(11,12,13,14),
season=c(21,22,23,24),
PH=c(1,2,3,4))
setDF(lapply(my.dataset1, function(x) shift(x, type = 'lead', fill = x[1L])))[]
# site season PH
# 1 12 22 2
# 2 13 23 3
# 3 14 24 4
# 4 11 21 1
对于您的用例而言,更直接的方法是简单地拆分和重组数据,例如:
rbind(my.dataset1[-1L, ], my.dataset1[1L, ])
# site season PH
# 1 12 22 2
# 2 13 23 3
# 3 14 24 4
# 4 11 21 1
shift
方法的优点是它可以适应各种用例。
如果您尝试覆盖原始表,则data.table
的更规范用法是像这样使用:=
:
library(data.table)
setDT(my.dataset1)
my.dataset1[ , (names(mydataset1)) :=
lapply(.SD, function(x) shift(x, type = 'lead', fill = x[1L]))]