R 中的数据操作
Data manipulations in R
作为项目的一部分,我目前正在使用 R 来分析一些数据。我目前无法从我从 csv 文件导入的现有数据集中检索一些值。
文件看起来像:
为了我的分析,我想创建另一列,它是 x
当前值与其先前值的减法。但是每个唯一 i
、x
的第一个值将与当前值相同。我是 R 的新手,一段时间以来我一直在尝试各种方法,但仍然无法找到一种方法。征求您对我完成此任务可以遵循的方法的建议。
我的数据结构
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")
您可以使用diff()
功能。如果要向现有数据框添加新列,diff 函数将 return 当前数据框的向量 x-1 长度。所以在你的情况下你可以试试这个:
# if your data frame is called MyData
MyData$newX = c(NA,diff(MyData$x))
那应该输入一个 NA 值作为新列中的第一个条目,其余值将是 "x" 列中顺序值之间的差值
更新:
您可以创建一个简单的循环,方法是对 "i" 的每个唯一实例进行子集化,然后计算您的 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)
您可以使用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))
作为项目的一部分,我目前正在使用 R 来分析一些数据。我目前无法从我从 csv 文件导入的现有数据集中检索一些值。
文件看起来像:
为了我的分析,我想创建另一列,它是 x
当前值与其先前值的减法。但是每个唯一 i
、x
的第一个值将与当前值相同。我是 R 的新手,一段时间以来我一直在尝试各种方法,但仍然无法找到一种方法。征求您对我完成此任务可以遵循的方法的建议。
我的数据结构
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")
您可以使用diff()
功能。如果要向现有数据框添加新列,diff 函数将 return 当前数据框的向量 x-1 长度。所以在你的情况下你可以试试这个:
# if your data frame is called MyData
MyData$newX = c(NA,diff(MyData$x))
那应该输入一个 NA 值作为新列中的第一个条目,其余值将是 "x" 列中顺序值之间的差值
更新:
您可以创建一个简单的循环,方法是对 "i" 的每个唯一实例进行子集化,然后计算您的 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)
您可以使用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))