2017-05-17 4 views
1

私はかなり新しく、コードにいくつかの問題があります。1を除くすべての列に値をルックアップし、最後の列から値を返します。

私はこのように見て、データフレーム持っている:私は値1982Q4を検索し、列datadateから対応する値を返すようにしたい列ごとに The data frame i'm using

を。私はコードを使用してみました:

Constituents_list <- colnames(datacqtr) 
Constituents_list <- Constituents_list[-1] 
Results <- 0 
for(i in Constituents_list) { 
Results <- cbind(Results, na.omit(with(datacqtr,datadate[Constituents_list== "1982Q4"]))) 
} 

しかし、それは動作しません。私は列がコード

Results <- cbind(Results, na.omit(with(datacqtr,datadate[`6307`== "1982Q4"]))) 

を使用して自分自身に名前を書く場合、私は正常に一つの値を取得することができます。しかし、私は3000以上の列を持っているので、それは本当にオプションではありません。

誰かが助けてくれてありがとう!

敬具 ラスマス

答えて

3

これはうまくいくかもしれないかどうかを試してみてください。

小さなデータフレームをシミュレート
apply(datacqtr[,-1], 2, function(x) datacqtr$datadate[grepl("1982Q4",x)]) 
+0

これは完璧に動作します - ありがとうございます! – Rasmus

+0

すばらしい答え!これは、for-loopを使うよりもエレガントです。 – Jon

1

df <- data.frame(
    datadate=c('a', 'b', 'c', 'd'), 
    A=c('1982Q4', NA, NA, NA), 
    B=c(NA, '1982Q4', NA, NA), 
    C=c(NA, NA, '1982Q4', NA), 
    D=c(NA, NA, NA, '1982Q4') 
) 

datadate列の列Aに対応する値がaなり、等々。

今、あなたは適用に使用できる(Rに、forループを使用しないよう):

apply(df, 2, function(x) df$datadate[which(x=='1982Q4')]) 

出力:

$A 
[1] a 
Levels: a b c d 

$B 
[1] b 
Levels: a b c d 

$C 
[1] c 
Levels: a b c d 

$D 
[1] d 
Levels: a b c d 
+0

それも同様に動作します、ありがとう! – Rasmus

1

おそらく最速の方法は、ルックアップテーブルとして最初の列を使用することですmax.colを使用して、各列の目的の索引を取り除きます。

@thebiroによって提供された例では、あなたはここで

df$datadate[max.col(df[-1] == "1982Q4" & !is.na(df[-1]))] 
[1] a b c d 
Levels: a b c d 

をするだろう、あなたは==で値をチェックし、値がNAでないことを確認する必要があります。

関連する問題