根据两列

时间:2017-05-25 13:11:28

标签: r

我一直在努力寻找解决方案,但我只找到间隔和频率分布解决方案。

我有一个包含更多100,000行和2列的大数据集,并显示了以下示例。

此数据集(nm)有两列,如下所述:

nm
predict actual
502.31  215.66
369.43  143.48
108.43  0.00
273.28  87.87
108.43  0.00
268.19  86.00
108.43  0.00
108.43  0.00
108.43  0.00
268.19  86.82
108.43  0.00
108.43  5.00
268.19  88.00
108.43  5.00

现在我想要新的数据集(kl),其中需要以下输出:

kl
pred1   actual_range
108.43  0 - 5
502.31  215.66
268.19  86 - 88
273.28  87.87

Pred_1应具有预测的所有唯一值,而Actual_range应具有该实际列的特定预测值的范围/桶。

如何为大数据集创建此内容。

如果我的问题仍然不明确,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我们可以按操作进行分组。将'data.frame'转换为'data.table'(setDT(nm)),按'预测'分组,获取'{1}}'实际',range paste unique元素在一起

library(data.table)
setDT(nm)[, .(actual_range = paste(unique(range(actual)), collapse='-')), predict]

答案 1 :(得分:0)

这是使用base-R的可能解决方案:

DF <- read.csv(text=
"predict,actual
502.31,215.66
369.43,143.48
108.43,0.00
273.28,87.87
108.43,0.00
268.19,86.00
108.43,0.00
108.43,0.00
108.43,0.00
268.19,86.82
108.43,0.00
108.43,5.00
268.19,88.00
108.43,5.00")


res <-aggregate(actual~predict,
                data=DF,
                FUN=function(x){  
                  minV <- min(x)
                  maxV <- max(x)
                  if(minV != maxV)
                    return(paste0(minV,'-',maxV))
                  return(minV)
                })

> res
  predict actual
1  108.43    0-5
2  268.19  86-88
3  273.28  87.87
4  369.43 143.48
5  502.31 215.66