【发布时间】:2020-04-26 04:48:51
【问题描述】:
我的代码中有一个循环,我想重写它,因此运行代码需要更少的时间来竞争。我知道你总是必须避免代码中的循环,但我想不出另一种方法来实现我的目标。
所以我有一个数据集“df_1531”,其中包含大量数据,我需要使用 subset() 将这些数据切割成碎片(如果有人知道更好的方法,请告诉我 ;))。我有一个包含 21 个变量名的向量,我喜欢在其上分配 df_1531 的子集。此外,该脚本包含 22 个带有约束的变量 (shift_XY_time)。
所以,这是我现在的代码...
# list containing different slots
shift_time_list<- c(startdate, shift_1m_time, shift_1a_time, shift_1n_time,
shift_2m_time, shift_2a_time, shift_2n_time,
shift_3m_time, shift_3a_time, shift_3n_time,
shift_4m_time, shift_4a_time, shift_4n_time,
shift_5m_time, shift_5a_time, shift_5n_time,
shift_6m_time, shift_6a_time, shift_6n_time,
shift_7m_time, shift_7a_time, shift_7n_time)
# List with subset names
shift_sub_list <- c("shift_1m_sub", "shift_1a_sub", "shift_1n_sub",
"shift_2m_sub", "shift_2a_sub", "shift_2n_sub",
"shift_3m_sub", "shift_3a_sub", "shift_3n_sub",
"shift_4m_sub", "shift_4a_sub", "shift_4n_sub",
"shift_5m_sub", "shift_5a_sub", "shift_5n_sub",
"shift_6m_sub", "shift_6a_sub", "shift_6n_sub",
"shift_7m_sub", "shift_7a_sub", "shift_7n_sub")
# The actual loop that I'd like to rewrite
for (i in 1:21) {
assign(shift_sub_list[i], subset(df_1531, df_1531$'PLS FFM' >= shift_time_list[i] & df_1531$'PLS FFM' < shift_time_list[i+1]))
}
运行循环大约需要 6 或 7 秒。因此,如果有人知道编写我的代码的更好/更清洁或更快的方法,我非常想听听您的建议/意见。
**可重现的示例**
mydata <- cars
dput(cars)
structure(list(speed = c(4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11,
12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16,
16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20,
22, 23, 24, 24, 24, 24, 25), dist = c(2, 10, 4, 22, 16, 10, 18,
26, 34, 17, 28, 14, 20, 24, 28, 26, 34, 34, 46, 26, 36, 60, 80,
20, 26, 54, 32, 40, 32, 40, 50, 42, 56, 76, 84, 36, 46, 68, 32,
48, 52, 56, 64, 66, 54, 70, 92, 93, 120, 85)), class = "data.frame", row.names = c(NA,
-50L))
dist_interval_list <- c( 0, 5, 10, 15,
20, 25, 30, 35,
40, 45, 50, 55,
60, 65, 70, 75,
80, 85, 90, 95,
100, 105, 110, 115, 120)
var_name_list <- c("var_name_1a", "var_name_1b", "var_name_1c", "var_name_1d",
"var_name_2a", "var_name_2b", "var_name_2c", "var_name_2d",
"var_name_3a", "var_name_3b", "var_name_3c", "var_name_3d",
"var_name_4a", "var_name_4b", "var_name_4c", "var_name_4d",
"var_name_5a", "var_name_5b", "var_name_5c", "var_name_5d",
"var_name_6a", "var_name_6b", "var_name_6c", "var_name_6d")
for (i in 1:24){
assign(var_name_list[i], subset(mydata,
mydata$dist >= dist_interval_list[i] &
mydata$dist < dist_interval_list[i+1]))
}
【问题讨论】:
-
你能提供一个最小可重现的例子吗?
-
你可以从
split(df_1531,findInterval(df_1531$"PLS FFM",shift_time_list))开始。请提供一个可重复的示例以避免在黑暗中拍摄(我也可以尝试)并避免使用assign。而是使用命名列表。 -
如果你describe your whole problem,你可能会得到更多“启发性”的答案,而不是你最终到达的某个孤独的小巷;)
-
@akash97,nicola,我已经在问题中添加了可重现的示例,我希望它足够好。 @ liborm,不幸的是,我在询问有关编程主题的问题方面相当缺乏经验。感谢您的链接和提示!
-
@J.O.P.P.好吧,让我们慢慢来:)我确定您的目标不是在您的 R 环境中拥有 24 个新变量。您可能想对这些不同的集合进行某种聚合?比如计算平均速度..?
标签: r loops for-loop subset assign