2017-07-19 3 views
0

私は何百万行もこれを実行する必要があるので、効率的な方法で以下のループを実行したいと思います。 サンプルデータがRの下のコードをループする高速かつ効率的な方法

a <- data.frame(x1=rep(c('a','b','c','d'),5), 
       x2=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5), 
       value1=c(rep(201,4),rep(202,4),rep(203,4),rep(204,4),rep(205,4)), 
       y1=c(rep('a',4),rep('b',4),rep('c',4),rep('d',4),rep('e',4)), 
       y2=c(1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7,5,6,7,8), 
       value2=seq(101,120), stringsAsFactors = FALSE) 

私は2つの列の間で同様の値を比較して、違いを見つけるために、以下に書きました。それぞれについて、

for (i in 1:length(a$x1)){ 
    for (j in 1:length(a$x1)){ 
    if(a$y1[i] == a$x1[j] & a$y2[i] == a$x2[j]){ 
     a$diff[i] <- a$value1[j] - a$value2[i] 
     break 
    } 
    } 
} 
+2

私が期待される出力がどうあるべきかを理解いくつかの問題を抱えているし、そしてI forループに問題があると思われます。あなたの質問を編集して、あなたの例で出力 'diff'列がどのように見えるかを表示できますか? –

+0

あなたが指定した例は正しいですか?例えば、i = 15の場合 – Wen

+0

今編集したbreak文がありませんでした。指摘していただきありがとうございます。 – Lufy

答えて

0

私は、あなたは、このようなa$y1[i] == a$x1[j] && a$y2[i] == a$x2[j](あなたのコードでは、明らかに間違っている&代わりの&&がある)、第一Jを見つけることです。

(あなたの例のように)スペースなしの数字や文字データのどちらかである、あなたは私がそれぞれのその後

x12 = paste(a$x1, a$x2) 
y12 = paste(a$y1, a$y2) 

を使用することができa$y2a$y1a$x2a$x1場合、あなたは、このような最初のJを見つけることですこれはmatch(x12, y12)で行います。

は、だから、このような何かを行うことができます。

x12 = paste(a$x1, a$x2) 
y12 = paste(a$y1, a$y2) 
m = match(x12, y12) 
for (i in seql(m)) 
    if (!is.na(m[i])) 
     a$diff[i] <- a$value1[m[i]] - a$value2[i] 

は、次のような最後のループ解消することができます。

x12 = paste(a$x1, a$x2) 
y12 = paste(a$y1, a$y2) 
m = match(x12, y12) 
good.i = which(!is.na(m)) 
a$diff[good.i] <- a$value1[m[good.i]] - a$value2[good.i] 
関連する問題