2016-07-07 8 views
0

ベクトル( "Date")の値が2番目のデータフレーム( "df $")内の他の日付値と一致するかどうかに応じて、データフレーム( "DF"日付")。 彼らは出力値と一致した場合は1でなければならない、そうでない場合は0forループを使用してデータフレームを作成する

私は私の友人によって作られたこのコードを調整しようとしたが、それは動作しません:

for(j in 1:length(Date)) { #Date is a vector with all dates from 1967 to 2006 
    # Start count 
    count <- 0 
    # Check all Dates between 1967-2006 
    if(any(Date[j] == df$Date)) { #df$Date contains specific dates of interest 
     count <- count + 1 
    } 
    # If there is a match between Date and df$Date, its output is 1, else 0. 
    DF[j,i] <- count 
    } 

メインデータフレーム」 DF "には190個の列があり、それには塗りつぶされなければならず、もちろん、Dateベクトルに等しい数の行があります。


余分な情報


1)各列は、他のものとは異なっており、従って、行の観察は、単一の行、すなわち(全て等しくすることができない、私は間の混合物を有していなければなりません0と1)。 2) "DF"の列名も "df"にdf $ Codeとして存在します。あなたがのすべての単一の列を記入したい場合は

Mat[,i] <- as.integer(Date%in%df$Date); 

+0

たぶん '適用されます(MAT、2、機能(ⅰ)as.numeric(I == Date)) ' – zx8754

+0

[すばらしいRの再現可能な例を作るには?](http://stackoverflow.com/questions/5963269) – zx8754

答えて

0

私たちは、整数に論理強要することは、真のために偽のための0と1を返すという事実を活用し、%in%as.integer()でこの操作をベクトル化することができます

Mat[] <- as.integer(Date%in%df$Date); 

:全く同じ結果ベクトルと Mat

私の上記のコードは、あなたの(元の)質問のコードのロジックを正確に再現しています。

あなたの編集から、私は要件を理解して、100%わからないんだけど、私の最高の推測では、これです:

set.seed(4L); 
LV <- 10L; ND <- 10L; 
Date <- sample(seq_len(ND),LV,T); 
df <- data.frame(Date=sample(seq_len(ND),3L),Code=c('V1','V2','V3')); 
DF <- data.frame(V1=rep(NA,NV),V2=rep(NA,NV),V3=rep(NA,NV)); 
Date; 
## [1] 6 1 3 3 9 3 8 10 10 1 
df; 
## Date Code 
## 1 8 V1 
## 2 3 V2 
## 3 1 V3 
for (cn in colnames(DF)) DF[,cn] <- as.integer(Date%in%df$Date[df$Code==cn]); 
DF; 
## V1 V2 V3 
## 1 0 0 0 
## 2 0 0 1 
## 3 0 1 0 
## 4 0 1 0 
## 5 0 0 0 
## 6 0 1 0 
## 7 1 0 0 
## 8 0 0 0 
## 9 0 0 0 
## 10 0 0 1 
+0

こんにちは、ありがとうございました。あなたのコードは完璧に動作しますが、私の質問はそれほど良くないとは思いませんでした(それは簡単ではありません)。あなたは更新を見ることができます。 –

+0

@ user181187編集を参照してください。 – bgoldst

+0

素晴らしいどうもありがとう。 –

関連する問題