【发布时间】:2018-10-13 07:05:27
【问题描述】:
通常,我会通过运行循环来处理此类问题(可能仍然不是最好的解决方案),但我正在处理一个非常大的数据集(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 代码以使其正常工作?
如果您需要更多信息,请告诉我。
提前致谢!
【问题讨论】:
-
DIVISION可以取多少个值? -
除法可能有 10 个唯一值。