【问题标题】:Group a continuous variable in R在 R 中对连续变量进行分组
【发布时间】:2013-09-10 22:38:18
【问题描述】:

我的目标是在数据透视表中比较某个特定商店的存在与我们可以找到这些商店的人口密度之间是否存在联系。为此,我有一个 CSV 文件,其中包含 600 个有或没有商店的区域示例。这是一个包含 600 行和两列的文件:1/ 代表一个区域的人口密度的数字,以及 2/ 该区域中该特定商店的数量(0、1 或 2)。

为了制作数据透视表,我需要将密度分组为 10 组,每组 60 行(第一组中 60 个较大的密度,直到最后一组 60 个较小的密度)。然后,我就可以很容易地看到建了多少商店,密度是低还是高。我可以理解吗(我希望)? :)

我想没什么难的。但是有很多方法(和包)可以解决这个问题......我有点迷路了。

我的主要问题:将我的变量分成十组每组 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 行?我准确地说数据框从最低到最高正确排列。

我当然想念什么……但是什么?

【问题讨论】:

  • 你能分享一些你尝试过的东西吗,就像在实际代码中一样? cuthist 怎么工作?您真的想要每个组中的偶数或整个范围内的均匀分布吗?
  • 您可以使用percentile
  • @justin 很好的问题!我真的每组都需要偶数。正是我没有用“cut”和“hist”来制作......
  • @Metrics 抱歉,我不熟悉这个概念。你能发展吗? :)
  • 我认为至少部分问题在于您没有告诉 R 您使用逗号作为小数点。使用read.csv2 会有所帮助。因为您没有将小数点设置为逗号,所以您正试图将因子直接转换为 cut 中的数值变量。这就是为什么cut 的输出没有覆盖你的变量范围。

标签: r hmisc


【解决方案1】:

我认为,一旦您有一个数字变量可以使用,您就会对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))

【讨论】:

  • 完美!我已经完成了我正在寻找的东西。谢谢大家! :)
【解决方案2】:

响应您的数据:您需要更正数据输入中的错误:

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)

(请不要再称这些“数据透视表”了。这是 Excel 的一种聚合策略,应该真正学会用标准统计或数学术语来描述所需的输出。)

【讨论】:

  • 好的,我复制它,排序和选择数据似乎很有用。但是(对不起),我不明白我怎样才能用它来制作我的 10 组 60 行。我不想选择数据,我想对一列进行递增排序(好的,简单),然后按 10 组堆积得到 10 行。很难简单解释。很抱歉坚持。并且可以停止使用丑陋的“数据透视表”,它只是一个翻译工具......感谢您的第一个答案。 ;)
猜你喜欢
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多