我的目标是在数据透视表中比较一个特定商店的存在与我们能找到这些商店的人口密度之间的联系。为此,我有一个CSV文件,有600个区域,其中有OR而不是商店。这是一个包含600行和两列的文件:1 /表示一个区域的人口密度的数字,2 /此区域中此特定商店的数量(0,1或2)。
为了进行数据透视表,我需要将密度分为10组,每组60行(在第一组中,60个较大的密度,直到最后一组具有60个较小的密度)。然后,我可以很容易地看到有多少商店,密度是低还是高。我可以理解(我希望)? :)
我想没什么难的。但是有一些方法(和包装)可以做到这一点......我有点失落。
我的主要问题:哪种方法可以将变量分组为10组,每组60行?我已经尝试了cut()/ cut2()和hist()但没有成功,我听说过bin_var()和reshape(),但我不明白它们如何对这种情况有所帮助。
例如(正如贾斯汀所说)。 用cut():
data <- read.csv("data.csv", sep = ";")
groups <- cut(as.numeric(data$densit_pop2), breaks=10)
summary(groups)
(0.492,51.4] (51.4,102] (102,153] (153,204] (204,255] (255,306]
53 53 52 52 52 54
(306,357] (357,408] (408,459] (459,510]
52 59 53 54
好的,好的,确实'群组'包含10个具有几乎相同行数的群组。但是间隔中指出的某些值对我没有任何影响。这是密度列的第一行(递增排序):
> head(data$densit_pop2)
[1] 14,9 16,7 17,3 18,3 20,2 20,5
509 Levels: 100 1013,2 102,4 102,6 10328 103,6 10375 10396,8 104,2 ... 99,9
我的意思是,看看第一组。为什么0.492时14.9是我的最小值?并且,如果我手动计算第一个和51.4之间的线数,我找到76.为什么它表示53行?我确切地说,数据帧从最低到最高排名正确。
我当然想念一些......但是什么?
答案 0 :(得分:3)
一旦你有一个数字变量可以使用,我认为你会对cut2
感到满意。使用逗号作为小数点分隔符时,请在读取数据集时使用read.csv2
或使用参数dec = ","
。
y = runif(600, 14.9, 10396.8)
require(Hmisc)
summary(cut2(y, m = 60))
您可以使用cut
执行相同的操作,但是您需要在适当的分位数处设置中断以获得相同的组,这需要更多的工作。
summary(cut(y, breaks = quantile(y, probs = seq(0, 1, 1/10)), include.lowest = TRUE))
答案 1 :(得分:1)
回应您的数据:您需要更正数据输入中的错误:
data$densit_pop3 <- as.numeric(
sub('\\,', '.',
as.character(data$densit_pop2)))
然后。这些内容(假设这不是关于从文本文件加载数据的问题):
with(dfrm, by(dens, factor(shops), summary) )
作为hte输出的一个例子,可能会得到:
with(BNP, by( proBNP.A, Sex, summary))
Sex: Female
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
5.0 55.7 103.6 167.9 193.6 5488.0 3094899
---------------------------------------------------------------------
Sex: Male
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
5 30 63 133 129 5651 4013760
如果你试图用这个来看密度密度(在这种情况下似乎是一个合理的要求),那么试试这个:
require(lattice)
densityplot( ~dens|shops, data=dfrm)
(请停止调用这些&#34;数据透视表&#34;。这是Excel的聚合策略,应该学会用标准统计或数学术语来描述所需的输出。)