使用循环

时间:2017-06-05 12:16:16

标签: r for-loop sum

我有一个看起来像这样的表:(注意:这只是一个部分表,我的真实表有几列qresult_#和trial _#)

Contract    FA     NAAR    q    trial_1   qresult_1    trial_2    qresult_2 
CM300      9746    47000  0.5    0.4352      d          0.7534        l
UL350     80000      0    0.01   0.9287      l          0.2336        l
RAD34     50000    10000  0.943  0.6161      d          0.1545        d

使用for循环计算表,以便根据我的意愿为尽可能多的列创建列trial_i和qresult_i。这是用于创建表的代码:

testdata <- data.frame(Contract = as.character(c("CM300","UL350","RAD34")),
                  FA = as.numeric(as.character(c("9746","80000","50000"))),
                  NAAR = as.numeric(as.character(c("47000","0","10000"))),
                  q = as.numeric(as.character(c("0.50","0.01","0.943"))))

trialmax <- 2
for(i in 1:trialmax){
   trial <- runif(3, min = 0, max = 1)
   testdata[ , paste0("trial_", i)] <- trial
   testdata[ , paste0("qresult_", i)] <- ifelse(trial >= testdata$q, "l", "d")
}

以下是我的问题:我想对所有标有“&#39; d”的合同中的FA列和NAAR列进行总结,并将所有合同标记为&#39; l&#39;每个试验单独。因此,对于trial_1,FA为&#39; d&#39;将是59746和NAAR for&#39; d&#39;将是57000,FA为&#39; l&#39;将是80000和NAAR for&#39; l&#39;将是0.并为每个试验重复这一点。最终结果将是每个试验的四个值。

我还没找到允许我成功运行它的代码。我希望每个试验的预期输出为四个值。也许看起来像这样,每次试验重复:

trial1_d_fa <- if(trial_1 = 'd') {sum(testdata$FA)}
trial1_l_fa <- if(trial_1 = 'l') {sum (testdata$FA)}
trial1_d_naar <- if(trial_1 = 'd') {sum(testdata$NAAR)}
trial1_l_naar <- if(trial_1 = 'l') {sum(testdata$NAAR)}

我正在努力让for循环工作,因为代码中的列名是使用i定义的。我是R的新手,所以任何提示都非常感谢!

编辑:更新

下面bouncyball建议的代码处理我的测试数据,但当我在我的实际数据上使用它时,我收到以下错误消息:

Error in match.names(clabs, names(xi)) :
names do not match previous names

浏览本网站,我发现rbind()功能存在问题。我试过转换列名以匹配我的数据,但我仍然得到同样的错误。

这是我的数据集head(data)的开头。任何建议表示赞赏!

Contract    FA     NAAR      q      trial_1    qresult_1    trial_2    qresult_2    
CM20002U  10000   4902.34   0.0255   0.7921        l        0.5182       l
CM20051U  45700   28788.81  0.0121   0.0083        d        0.0707       l
CM20076U  50000   20824.54  0.1054   0.5616        l        0.0915       d

1 个答案:

答案 0 :(得分:0)

以下是使用lapplyby函数的方法。我们需要重复调​​用do.call('rbind', ...),因为lapply列表中有两个条目:

trial_max <- 2

do.call('rbind', 
        do.call('rbind', 
                lapply(paste0('qresult_', 1:trial_max), function(q){
                  by(testdata, testdata[,q], FUN = function(d) 
                    data.frame('id' = q, 
                               'val' = unique(d[,q]), 
                               'sum_FA' = sum(d$FA),
                               'sum_NAAR' = sum(d$NAAR),
                               stringsAsFactors = FALSE))
})))

         id val sum_FA sum_NAAR
1 qresult_1   d  59746    57000
2 qresult_2   d  59746    57000
3 qresult_1   l  80000        0
4 qresult_2   l  80000        0

使用lapply,我们迭代qresult_i列,然后我们使用by函数将函数应用于testdata按各自qresult_i中的值进行拆分1}}列。最后,我们将结果存储在data.frame

结果存储在data.frame中,这样可以轻松地进行子集化并获取您感兴趣的值。