通常情况下,我会通过运行一个循环来处理这类问题(可能还不是最好的解决方案),但我正在处理一个非常大的数据集(780万个观测值),并且我一直在尝试更有效地编程它 . 这是我的数据集的一个非常小的子集:
df = data.frame(STATE = c("PA", "PA", "MD","MD", "MO", "MO"),
DIVISION = c("Middle_Atlantic", "Middle_Atlantic","South_Atlantic","South_Atlantic","West_North_Central","West_North_Central"),
Middle_Atlantic_NSA = c(117.77, 119.43, 119.43, 120.72, 119.11, 117.77),
Middle_Atlantic_SA = c(118.45, 119.65, 119.65, 120.73, 119, 118.45),
South_Atlantic_NSA = c(134.45, 135.2, 135.2, 136.69, 134.07, 134.45),
South_Atlantic_SA = c(134.25, 134.83, 134.83, 135.97, 133.86, 134.25),
West_North_Central_NSA=c(152.24, 153.61, 153.61, 155.19, 151.08, 152.24),
West_North_Central_SA=c(152.77, 153.19, 153.19, 154.44, 151.63, 152.77),
DIV_HPI_NSA = c(117.77, 119.43, 135.2, 136.69, 151.08, 152.24),
DIV_HPI_SA = c(118.45, 119.65, 134.83, 135.97, 151.63, 152.77))
我已经为变量“DIV_HPI_NSA”和“DIV_HPI_SA”包含了我想要的输出 . 我试图完成的是在“DIVISION”(例如“Middle_Atlantic”)中查找附加后缀“_NDA”的值,并将该变量的相应值(在本例中为“Middle_Atlantic”)返回给新变量“ DIV_HPI_NSA” . 我对“DIV_HPI_SA”变量做了同样的事情 . 目前,我正在尝试使用get()函数或eval(parse(text =“text_here”))方法将字符串作为列名进行评估并生成正确的值,但是它们并不像我所希望的那样工作 . 理想情况下,我更喜欢dplyr解决方案,因为与循环相比,它的处理速度相对较快 . 我不确定为什么这不适用于dplyr,并且想了解为什么以及如何成功执行它 . 以下是颜色协调所需输出的屏幕截图 .
这是我目前的代码:
comb.df = df %>%
mutate(DIV_HPI_NSA = get(paste0(DIVISION,"_NSA")),
DIV_HPI_SA = eval(parse(text = (paste0(DIVISION,"_SA")))))
这就是我如何通过一个循环 - 它产生正确的结果,但它需要一个荒谬的时间:
for(i in 1:dim(comb.df)[1]){
comb.df$DIV_HPI_NSA[i] = comb.df[i, paste0(comb.df$DIVISION[i],"_NSA")]
comb.df$DIV_HPI_SA[i] = comb.df[i, paste0(comb.df$DIVISION[i],"_SA")]
}
我的当前输出(即DIV_HPI_NSA)继续提供与“DIVISION”列中评估的第一个元素相对应的列输出 . 例如,“DIV_HPI_NSA”的dplyr方法仅返回“Middle_Atlantic_NSA”列中的值,因为这是“DIVISION”中的第一个元素 . eval()也有相同的问题,并没有生成正确的行输出 .
是否有比dplyr更好/更快的方法,和/或如何修复我的dplyr代码以使其正常工作?
如果您需要其他信息,请与我们联系 .
提前致谢!
1 回答
答案可能取决于
DIVISION
可以采用的值的数量 .这是一个只有“_NSA”的小基准,但显然你可以在以后用“_SA”做同样的事情 .
结论
对于6k线数据集,
apply
(137s)比base
(630s)快6倍香草
dplyr
甚至更快(2s)rlanged
dplyr
比香草(9s)慢一点时间似乎随着
base
和apply
以100ms /线线性扩展,因此8M线应该花费大约8M秒= 1周 .dplyr
次似乎呈指数级扩展,所以我不能说它是否适用于你的大数据集 .