优化 matrix/data 框架的创建
Optimize the creation of a matrix/data frame
我正在尝试使用与旧数据框中的列值相匹配的值列表创建一个新的 matrix/data 框架。同样对于新的 matrix/data 框架,我想保留用于匹配的值列表中的顺序。这是我想要实现的示例:
#A list of values used for matching
time.new <- c(2, 3, 4, 3, 4, 5, 4, 5, 6)
#The old data frame which I would match on the column of time.old
old <- data.frame(time.old=1:10, y=rnorm(10))
我通过使用 merge
和 order
得到了一个解决方案(见下文),但我想避免使用 merge
和 order
,因为它们确实会减慢速度,我有一个更大的数据集。矩阵结果是首选,因为数据框也可能很慢(用于进一步操作)所以任何想法将不胜感激!
time.new <- data.frame(id = 1:length(time.new), time=time.new)
new_dataframe <- merge(x = time.new, y = old, by.x = "time", by.y="time.old", all.x = TRUE)
new_dataframe <- new_dataframe[order(new_dataframe$id), ]
new_dataframe$id <- NULL
我们可以用match
加入time.new
和time.old
得到对应的
y
值。
set.seed(123)
time.new <- c(2, 3, 4, 3, 4, 5, 4, 5, 6)
old <- data.frame(time.old=1:10, y=rnorm(10))
cbind(time = time.new, y = old$y[match(time.new, old$time.old)])
# time y
# [1,] 2 -0.2302
# [2,] 3 1.5587
# [3,] 4 0.0705
# [4,] 3 1.5587
# [5,] 4 0.0705
# [6,] 5 0.1293
# [7,] 4 0.0705
# [8,] 5 0.1293
# [9,] 6 1.7151
我正在尝试使用与旧数据框中的列值相匹配的值列表创建一个新的 matrix/data 框架。同样对于新的 matrix/data 框架,我想保留用于匹配的值列表中的顺序。这是我想要实现的示例:
#A list of values used for matching
time.new <- c(2, 3, 4, 3, 4, 5, 4, 5, 6)
#The old data frame which I would match on the column of time.old
old <- data.frame(time.old=1:10, y=rnorm(10))
我通过使用 merge
和 order
得到了一个解决方案(见下文),但我想避免使用 merge
和 order
,因为它们确实会减慢速度,我有一个更大的数据集。矩阵结果是首选,因为数据框也可能很慢(用于进一步操作)所以任何想法将不胜感激!
time.new <- data.frame(id = 1:length(time.new), time=time.new)
new_dataframe <- merge(x = time.new, y = old, by.x = "time", by.y="time.old", all.x = TRUE)
new_dataframe <- new_dataframe[order(new_dataframe$id), ]
new_dataframe$id <- NULL
我们可以用match
加入time.new
和time.old
得到对应的
y
值。
set.seed(123)
time.new <- c(2, 3, 4, 3, 4, 5, 4, 5, 6)
old <- data.frame(time.old=1:10, y=rnorm(10))
cbind(time = time.new, y = old$y[match(time.new, old$time.old)])
# time y
# [1,] 2 -0.2302
# [2,] 3 1.5587
# [3,] 4 0.0705
# [4,] 3 1.5587
# [5,] 4 0.0705
# [6,] 5 0.1293
# [7,] 4 0.0705
# [8,] 5 0.1293
# [9,] 6 1.7151