2017-08-28 6 views
3

私はこのトピックについて尋ねられたさまざまな質問を見てきましたが、今のところ私が望むものを得るのを助けてくれませんでした。R:差分を計算して新しい変数に格納するためのループを書く

私は2つの変数(standardized_'estestname ')と' predicted_standardized_'estestname 'という2つの変数を持つデータフレームを持っています。今、私は2つの違いを計算し、それを 'testname'_finalscoreという新しい変数に保存したいと思います。

私は約19種類のテストがあるので、私はこれをRのforループでやりたいのですが、私はこの種のループを書くのが初めてです。

私は別のテストのすべての名前と、testlistというのがあります。このオーバー

testlist <- c("vlgt_ltfr", "vlgt_recog", 
      "vlgt_imrec", "wms_imrec", 
      "wms_delrec", "fluency_dier", 
      "fluency_beroep", "tapdom", 
      "tapndom", "traila", "trailb", 
      "erik_congruent", "erik_percincong", 
      "erik_incongruent", "stroop_baseline", 
      "stroop_interference", "subrs", "tmt_interference") 

、私は標準化されたとpredicted_standardizedスコアを計算するためのループを書かれています。

例:この後

for(test in testlist){ 
     patdat[,paste0('standardized_',test)] <- (patdat[,test] - tempmean)/tempsd 
     patdat[,paste0('predicted_standardized_',test)] <- coef(mymod)[1] + coef(mymod)[2]*patdat[,'p_age'] + coef(mymod)[3]*patdat[,'nlviq'] 

}

が、私は違いを計算し、新しい変数に格納しを試みるする(動作しない)異なるループを作成しました:

for(test in testlist){ 
    normdata[,paste0(test,'_finalscore')] <- (normdata[,paste0('standardized_', test)] - normdata[,paste0('predicted_standardized_', test)]) 
} 

for(test in testlist){ 
    normdata[,paste0(test, '_finalscore')] <- normdata[get('standardized_',test)] - normdata[get('predicted_standardized_'), test] 
} 

for(test in testlist){ 
    normdata[,paste0(test, '_finalscore')] <- (normdata['standardized_',test] - normdata['predicted_standardized_', test]) 
} 

私は 'testname'_finalscoreで変数を取得しますが、空です。私は間違ってインデックスを作成していると私はこの問題を解決するために使用できる関数があるかもしれないと思う - しかし、私はまだそれを見つけていない。事前に

> normdata$standardized_subrs - normdata$predicted_standardized_subrs 
[1] 0.002764 0.436435 0.676208 0.598205 -0.217296 -1.796589 
[7] -0.002633 0.300938 -0.022676 0.262987 -0.652819 -0.132400 

ありがとう:私は取得したいどのようなデータ

> normdata$standardized_subrs 
[1] -0.45551 0.61058 0.18414 0.18414 -0.13568 -1.30838 0.39736 
[8] 0.71719 -0.13568 -0.13568 0.29075 0.18414 1.99649 -1.62821 

> normdata$predicted_standardized_subrs 
[1] -0.458274 0.174143 -0.492066 -0.414063 0.081612 0.488208 
[7] 0.399994 0.416249 -0.113008 -0.398671 0.943571 0.316543 

OF

の例では、このような、しかしtestlistというのすべてのテストを探し、変数 "subrs_finalscore" です。

+1

'normdata < - data.frame( standardized_subrsの= Cの(-0.45551、0.61058、0.18414)、 predicted_standardized_subrsの= Cの(-0.458274、0.174143、-0.492066) )。 testlist < - c( "subrs"); (テストリストのテスト){ normdata [、paste0(test、 '_ finalalscore')] < - (normdata [、paste0( 'standardized_'、test)] - normdata [、predict0standardized_ '、test] ]) } '私の側で動作します。それはあなたの上にありますか?そうでない場合は、何が問題(エラー)ですか? –

+0

これもここで動作します!それが前になかった理由、たぶんタイプミスか何か... ...ありがとう!間違っていたことを頭に浮かべることはできませんでした。 – HannekeLettinga

+0

あなたの例で 'standardized_subrs 'と 'predicted_standardized_subrs'の観測量は同じではありません –

答えて

7

各テストのデータフレームにはstandardizedpredicted_standardizedのカラムがあります。これはあなたの質問への答えを得るために働くハードフォームです。

2つの数値の差を計算して保存します。

TestName Standardized Predicted 
subrs  -0.45551 -0.458274 
subrs   0.61058 0.174143 
subrs   0.18414 -0.492066 
... 

代わりに、我々は唯一の3つの列との長い形式で保存する多くの列(各テストのための2つの列)とワイドフォーマットのデータを格納する:の名前データがこのように見えた場合はどうテスト、標準化された値、予測値。これはtidyingと呼ばれ、データはtidyの形式です。

我々はフレーム内tidy形式のデータは、tidy_data呼ばれていた場合には、差を計算することは

library(tidyverse) 
tidy_data %>% mutate(FinalScore = Predicted - Standardized) 

mutateは計算値でフレームに新しい列が追加されます...ように簡単です。

どうすればtidyフォームで取得できますか?それは少し仕事だが、我々は、元の幅のデータフレームを取るので、同じようにそれを変更した場合...

tidy_data = data %>% 
    mutate(row_num = row_number()) %>% 
    gather(key, value, -row_num) %>% 
    mutate(IsPredicted = ifelse(grepl("predicted", key), "Predicted", "Standardized"), 
     TestName = gsub("predicted_standardized_|standardized_", "", key)) %>% 
    select(TestName, IsPredicted, value, row_num) %>% 
    spread(IsPredicted, value) %>% 
    select(-row_num) 

は、我々は後にしている整頓フォームを取得します。

+0

私は3番目の正規形とその利点についてどこかで読んでいます::) –

関連する問題