2017-08-28 73 views
3

我已经查看了有关此主题的不同问题,但没有人帮助我获得我想要的结果。R:编写for循环来计算差异并存储在新变量中

我有一个数据框,有两个变量(standard_'testname')和'predicted_standardized_'testname')。现在,我想计算两者之间的差异并将其存储在名为'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 
[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 

我想要得到的是一个变量 “subrs_finalscore” 看起来像这样,但对于testlist所有测试:

> 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 

在此先感谢。

+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”); 为(在testlist测试){ normdata [,paste0(测试, '_ finalscore')] < - (normdata [,paste0( 'standardized_',测试)] - normdata [,paste0( 'predicted_standardized_',测试) ]) }'在我身边工作。对你有帮助吗?如果不是,问题是什么(错误)? –

+0

它也适用于这里!不知道为什么它没有之前,也许是一个错字或什么...谢谢!无法理解发生了什么问题。 – HannekeLettinga

+0

你没有在你的例子中的'standardized_subrs '和'predicted_standardized_subrs'中观察到相同数量的 –

回答

7

我们在每个测试的数据框中有standardizedpredicted_standardized列。这是一个艰难的形式来处理你的问题的答案。

我们想计算两个数字之间的差异并存储它。如果数据是这样的:

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

而不是存储在多列宽格式的数据(两列每个测试),我们将其存储在长格式只有三列:的名字测试,标准化值和预测值。这被称为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

我记得读了关于第三范式及其好处的地方...... :) –