我有两个数据框。我可以使用嵌套for循环让R做我想做的事,但我确信有一种更有效的方法。
这是我的循环:
for (x in 1:dim(data)[1]){
for (y in 1:dim(Zone_Factor)[1]){
if(data[x,"ZONE"] == Zone_Factor[y,"Zone"] & data[x,"BLOCK"] == Zone_Factor[y,"Zone_Number"]){
data[x,"Zone_Factor"] <- Zone_Factor[y,"Factor"]
}
}
}
“data”是我的主要数据框(~100k行),“Zone_Factor”是一个小表,我根据“data”中的值提取数据。我比V更熟悉VBA,基本上我想使用“data $ ZONE”和“data $ BLOCK”对“Zone_Factor”进行vlookup。我玩which()
但没有运气(我的which()
功能发布在下面)
Zone_Factor[which(Zone_Factor[,"Zone"] == data$ZONE & Zone_Factor[,"Zone_Number"] == data$BLOCK), "Factor"]
这个循环在大约2分钟内运行,但我假设有一种更有效的方法。我可以做什么而不是使用嵌套循环?
答案 0 :(得分:1)
如果没有可重复的示例,您似乎只是尝试将两个数据框合并两个字段。
创建两个虚拟数据框:
library(dplyr)
data <- data.frame(ZONE = c("Tim", "Brad"),
BLOCK = c(32828, 32801))
Zone_Factor <- data.frame(Zone = c("Tim", "Tim", "John", "John", "Brad", "Brad"),
Zone_Number = c(32827, 32828, 32806, 32807, 32801, 32802),
Factor = c(10, 5, 20, 15, 30, 25))
根据您的命名惯例将它们合并在一起:
data <- data %>%
mutate(uid = paste0(ZONE, "-", BLOCK))
Zone_Factor <- Zone_Factor %>%
mutate(uid = paste0(Zone, "-", Zone_Number)) %>%
select(-Zone, -Zone_Number)
final_data <- left_join(data, Zone_Factor, by = "uid")
final_data$uid <- NULL
print(final_data)
# ZONE BLOCK Factor
#1 Tim 32828 5
#2 Brad 32801 30