首页 > 解决方案 > 在数据框中的每一列中将每个值向前移动一步

问题描述

原始数据框如下:

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    

标签: r

解决方案


“向前移动观察”也称为“滞后”或“移动”。您可以使用以下相当灵活的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]))]

推荐阅读