我在R中使用merge命令时遇到了一些问题,我正在尝试将值放入bin中,然后我可以将其用作绘图的颜色值。我想保留分位数bin值作为图例使用,所以我也将它合并回原始数据帧。
我遇到的问题是,当我这样做时,当我将分位数合并回原始数据帧以创建新的数据帧时,原始值会发生变化。我可能正在做一些明显错误的事情,但是现在已经玩弄了这个问题一段时间并且搜索“合并正在改变数据”并没有返回任何关于无意识的“改变数据”类型的东西我遇到了麻烦。谢谢!
# 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 :(得分:3)
我认为你的问题是
x$binnumber = tapply(x$x,cut(x$x,quantiles$quantiles))
请注意,这会导致x$binnumber
中的NA值。这是因为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