首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:写for循环来计算差异并存储在新变量中

R:写for循环来计算差异并存储在新变量中
EN

Stack Overflow用户
提问于 2017-08-28 12:03:05
回答 1查看 878关注 0票数 3

我看过关于这个话题的不同问题,但到目前为止,没有人帮助我得到我想要的东西。

我有一个dataframe,有两个变量(标准化的_‘testname’)和‘预测_标准化_’的‘testname’)。现在,我想计算两者之间的差异,并将其存储在一个名为'testname'_finalscore的新变量中。

因为我有大约19个不同的测试,所以我想用R中的for循环来完成这个任务--但是我还不知道如何编写这样的循环,而且我被困住了。

我有一个测试列表,列出了所有单独测试的名称:

代码语言:javascript
复制
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分数。

示例:

代码语言:javascript
复制
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']

}

在此之后,我创建了不同的循环(这些循环不起作用),在其中我试图计算差异并将其存储在一个新变量中:

代码语言:javascript
复制
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的变量,但是它是空的。我认为我的索引错误,可能有一个函数,我可以用来解决这个问题-但我还没有找到它。

数据示例

代码语言:javascript
复制
> 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“,它看起来如下所示,但是对于测试列表中的所有测试:

代码语言:javascript
复制
> 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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-28 12:54:50

每个测试的数据框架中都有standardizedpredicted_standardized列。这是一个很难用的形式来得到你的问题的答案。

我们想要计算两个数字之间的差额并存储它。如果数据看起来像这样呢:

代码语言:javascript
复制
TestName Standardized Predicted
subrs        -0.45551 -0.458274
subrs         0.61058  0.174143
subrs         0.18414 -0.492066
...

与其以宽格式存储多列(每个测试有两列),不如以长格式存储数据,只有三列:测试名称、标准化值和预测值。这被称为tidying --数据,或者以tidy格式放置它。

如果我们在一个名为tidy的框架中有tidy_data格式的数据,那么计算差异就像.

代码语言:javascript
复制
library(tidyverse)
tidy_data %>% mutate(FinalScore = Predicted - Standardized)

mutate用计算值向框架中添加一个新列。

那么,我们如何以tidy形式获得它呢?这是个小工作,但是如果我们把原始的宽数据框架改变成这样.

代码语言:javascript
复制
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)

我们得到了我们想要的整洁的表格。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45918549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档