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
解决方案
“向前移动观察”也称为“滞后”或“移动”。您可以使用以下相当灵活的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]))]
推荐阅读
- c# - 任务计划程序控制台输出在哪里?(C# 控制台应用程序)
- python - 查找 struct.pack() 字符串的格式
- java - 为 json 字符串创建一个通用的 java 映射器
- typescript - Set 类型上不存在属性“set”
- javascript - 更改创建数组的分隔符
- python-3.x - 保存 Kivy 对象
- python - 基于文本beautifulsoup将html包装在新标签中
- amazon-web-services - 是否可以在 AWS ElasticBeanstalk 中以编程方式替换 AMI?
- heroku - 无法使用 heroku 部署 jhipster-registry
- php - 创建新对象php并插入mysql