2016-07-13 4 views
0

2つのデータフレームがあります。私は、Rにネストされたforループを使って欲しいものをすることができますが、もっと効率的な方法があると確信しています。ここでR - 異なるdfの条件文を使用して1つのdfの参照値

は私のループです:

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"] 
    } 
    } 
} 

「のデータが」私のメインデータフレーム(〜100K行)であり、「Zone_Factorは、」私はデータ」の値に基づいてからデータを抽出しています小さなテーブルです"私はRよりもVBAに精通しています。基本的には、 "data $ ZONE"と "data $ BLOCK"を使って "Zone_Factor"のvlookupを行いたいと思います。私は、このループは約2分で実行されますが、私はこれを行うにははるかに効率的な方法があると仮定してい

Zone_Factor[which(Zone_Factor[,"Zone"] == data$ZONE & Zone_Factor[,"Zone_Number"] == data$BLOCK), "Factor"] 

(私のwhich()機能は以下の投稿)which()で遊んが、運がなかったです。ネストされたループを使用する代わりに私は何ができますか?

答えて

1

再現可能な例がないと、2つのデータフレームを2つのフィールドでマージしようとしているように見えます。

作成2つのダミーデータフレーム:あなたの命名規則に基づいてそれらを一緒にマージ

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 
+0

は素晴らしい作品、ありがとう! –

関連する問題