作为项目的一部分,我目前正在使用R来分析一些数据。我目前仍在使用从csv文件导入的现有数据集中检索少量值。
该文件如下:
对于我的分析,我想创建另一个列,即减去x
的当前值及其先前的值。但是,每个唯一i
,x
的第一个值与当前值相同。我是R的新手,我现在正尝试各种方式,但仍然无法找到一种方法。以我可以遵循的方法请求您的建议以实现此任务。
Mydata结构
structure(list(t = 1:10, x = c(34450L, 34469L, 34470L, 34483L,
34488L, 34512L, 34530L, 34553L, 34575L, 34589L), y = c(268880.73342868,
268902.322359863, 268938.194698248, 268553.521856105, 269175.38273083,
268901.619719038, 268920.864512966, 269636.604121984, 270191.206593437,
269295.344751692), i = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L)), .Names = c("t", "x", "y", "i"), row.names = c(NA, 10L), class = "data.frame")
答案 0 :(得分:2)
您可以使用包data.table
获取所需内容:
library(data.table)
setDT(MyData)[, x_diff := c(x[1], diff(x)), by=i]
MyData
# t x i x_diff
# 1: 1 34287 1 34287
# 2: 2 34789 1 502
# 3: 3 34409 1 -380
# 4: 4 34883 1 474
# 5: 5 34941 1 58
# 6: 6 34045 2 34045
# 7: 7 34528 2 483
# 8: 8 34893 2 365
# 9: 9 34551 2 -342
# 10: 10 34457 2 -94
数据:强>
set.seed(123)
MyData <- data.frame(t=1:10, x=sample(34000:35000, 10, replace=T), i=rep(1:2, e=5))
答案 1 :(得分:0)
您可以使用diff()
功能。如果要向现有数据框添加新列,diff函数将返回当前数据帧的向量x-1长度。所以在你的情况下你可以试试这个:
# if your data frame is called MyData
MyData$newX = c(NA,diff(MyData$x))
这应该输入一个NA值作为新列中的第一个条目,剩下的值将是&#34; x&#34;中的连续值之间的差值。柱
更新:
您可以通过对&#34; i&#34;的每个唯一实例进行子集化来创建一个简单的循环。然后计算你的x值之间的差异
# initialize a new dataframe
newdf = NULL
values = unique(MyData$i)
for(i in 1:length(values)){
data1 = MyData[MyData$i = values[i],]
data1$newX = c(NA,diff(data1$x))
newdata = rbind(newdata,data1)
}
# and then if you want to overwrite newdf to your original dataframe
MyData = newdf
# remove some variables
rm(data1,newdf,values)