我有一个看起来像这样的表:(注意:这只是一个部分表,我的真实表有几列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
答案 0 :(得分:0)
以下是使用lapply
和by
函数的方法。我们需要重复调用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
中,这样可以轻松地进行子集化并获取您感兴趣的值。