R - 使用不同df

时间:2016-07-13 19:54:58

标签: r dataframe

我有两个数据框。我可以使用嵌套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分钟内运行,但我假设有一种更有效的方法。我可以做什么而不是使用嵌套循环?

1 个答案:

答案 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