将每个值在数据框中的每一列中向前移动一个

时间:2018-07-17 09:10:27

标签: r

原始数据框如下:

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    

1 个答案:

答案 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]))]