2014-06-17 158 views
1

我在R中的合并命令遇到了一些麻烦,我尝试将值放入箱中,然后可以将其用作图的颜色值。我想保留分位数值作为图例使用,所以我也将它们合并回原始数据框。R'合并'正在改变合并数据帧中的数据

我现在的问题是,当我这样做时,我将分位数合并回原始数据框以创建新数据框时,原始值发生了变化。我可能做了一些明显错误的事情,但一段时间以来一直在玩弄这个问题,搜索“合并正在改变数据”并没有返回任何有关我遇到麻烦的无意的“改变数据”类型。谢谢!

# create random data 
x=rnorm(100,100,25) 
x=as.data.frame(x) 

# create bins to place the data in 
quantiles=quantile(x,c(seq(.05,.95,.05))) 
quantiles=as.data.frame(quantiles) 

# create bin number to merge upon later 
quantiles$binnumber=c(1:dim(quantiles)[1]) 

# create bin number in x to merge upon later 
x$binnumber=tapply(x$x,cut(x$x,quantiles$quantiles)) 

merged=merge(x,quantiles,by="binnumber") 

# should work right? note the difference in summary, 
# it seems the high and low values got changed 
# somehow while the middle values did not. 

summary(x$x) 

    Min. 1st Qu. Median Mean 3rd Qu. Max. 
39.35 83.15 95.67 98.92 116.30 190.80 

summary(merged$x) 

    Min. 1st Qu. Median Mean 3rd Qu. Max. 
60.62 84.46 95.67 97.92 114.20 136.40 
+0

有没有合并的[[“xx”]]?这里可能有名字冲突。 – asb

+2

合并时试试'all = TRUE'? –

+0

我想你可能也想改变你如何使用'cut',除非你打算把许多'x'值分配给bin。 – joran

回答

3

我觉得你的问题是

x$binnumber = tapply(x$x,cut(x$x,quantiles$quantiles)) 

注意,这导致NA值x$binnumber。这是因为quantiles$quantiles只能达到.95分位数,并且其值高于x。由于这些值超出了您指定的中断范围,因此将它们设置为NA。当你在binnumber上合并时,你不能合并NA值。

你可以通过使位数到1

quantiles <- quantile(x,c(seq(.05,1.00,.05))) 

,并包括所有的值低于最低位数较低的切割解决这个

x$binnumber <- tapply(x$x,cut(x$x,c(-Inf, quantiles$quantiles))) 

这样做应该给你匹配值

summary(merged$x) 
# Min. 1st Qu. Median Mean 3rd Qu. Max. 
# 43.34 83.46 105.30 102.60 121.20 170.50 

summary(x$x) 
# Min. 1st Qu. Median Mean 3rd Qu. Max. 
# 43.34 83.46 105.30 102.60 121.20 170.50 
+0

谢谢!将分位数序列从0开始而不是.05'分位数< - 分位数(x,c(seq(0,1.00,.05)))“与在tapply中包含-Inf完成相同的事情? – user3745597

+0

我尝试过,但它似乎在x bin数字中做了一个额外的组。我没有花足够的时间来弄清楚为什么。也许我还有其他错误。这值得一试。 – MrFlick

+0

@ user3745597刚刚进行了另一次更改以尝试它。是的,您可以设置品质从0到1,然后您只需确保执行'x $ binnumber = tapply(x $ x,cut(x $ x,quantiles $ quantiles,include.lowest = T)) '(添加'include.lowest ='参数) – MrFlick