【问题标题】:cutting a variable into pieces in R在R中将变量切割成碎片
【发布时间】:2020-02-18 04:31:00
【问题描述】:

我正在尝试将 cut() 我的数据 D 分成 3 部分:[0-4][5-12][13-40]见下图)。但我想知道如何在cut 中准确定义我的breaks 以实现这一目标?

这是我的数据和 R 代码:

D <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/t.csv", h = T)


 table(cut(D$time, breaks = c(0, 5, 9, 12))) ## what should breaks be?

 # (0,5]  (5,9] (9,12]  # cuts not how I want the 3 pieces .
 #  228     37     10

【问题讨论】:

  • 在您编写的代码示例中,带有9 的中断不会按照您想要的方式切割,其中没有9。除了那个多余的9,你能具体说明问题是什么吗?

标签: r function dataframe statistics categorical-data


【解决方案1】:

符号 (a,b] 表示 ">a 和

因此,要获得您想要的结果,只需定义切割,以便获得所需的分组,包括下限和上限:

table(cut(D$time, breaks=c(-1, 4, 12, 40)))

## (-1,4]  (4,12] (12,40] 
##   319      47      20 

您可能还会发现查看两个参数 right=FALSE 会有所帮助,这两个参数将区间的端点从 (a,b] 更改为 [a,b)include.lowest,其中包括最低的 breaks 值(在OP的示例,这是[0,5],下限带有右括号)。您也可以使用无穷大。下面是一个示例,其中包含几个可以使用的选项:

table(cut(D$time, breaks = c(-Inf, 4, 12, Inf), include.lowest=TRUE))

## [-Inf,4]    (4,12] (12, Inf] 
##     319        47        20 

【讨论】:

    【解决方案2】:

    这会产生正确的存储桶,但间隔符号需要调整。假设所有时间都是整数。可能需要手动调整标签 - 每次您有一个右开区间符号时,将因子标签替换为闭区间符号。使用你最好的字符串'magic'

    就个人而言,我喜欢确保涵盖所有可能性。也许这个过程的未来数据可能会超过 40?我喜欢在所有剪辑中设置+Inf 的上限。这可以防止NA 潜入数据中。

    cut 需要的是“仅整数”选项。

    F=cut(D$time,c(0,5,13,40),include.lowest = TRUE,right=FALSE)
    # the below levels hard coded but you could write a loop to turn all labels
    # of the form [m,n) into [m,n-1]
    levels(F)[1:2]=c('[0,4]','[5,12]')
    

    通常在获得最终结果之前会进行更多分析,因此在工作接近完成之前,我不会过多关注标签。

    这是我的结果

     > table(F) 
     F
     [0,4]  [5,12]  [13,40] 
     319      47      20 
    

    【讨论】:

      【解决方案3】:

      R 可以将整数与浮点数进行比较,就像在

      中一样
      > 6L >= 8.5
      [1] FALSE
      

      因此,您可以将浮点数用作breaks in cut,例如 in

      table(cut(D$time, breaks = c(-.5, 4.5, 12.5, 40.5)))
      

      对于整数,这可以满足您对 [0-4], [5-12], [13-40] 的存储桶定义,而无需考虑方括号与圆括号之间的关系。

      一个奇特的替代方案是围绕你的桶的平均值进行聚类

      D <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/t.csv", h = T)
      D$cluster <- kmeans(D$time, center = c(4/2, (5+12)/2, (13+40)/2))$cluster
      plot(D$time, rnorm(nrow(D)), col=D$cluster)
      

      【讨论】:

        【解决方案4】:

        您应该在代码中添加两个附加参数 rightinclude.lowest

        table(cut(D$time, breaks = c(0, 5, 13, 40), right=FALSE, include.lowest = TRUE)) 
        

        right=FALSE 的情况下,间隔应在左侧关闭并在右侧打开,以便您获得所需的结果。 include.lowest=TRUE 导致您的最高中断值(此处为 40)包含到最后一个间隔。 结果:

        [0,5)  [5,13) [13,40] 
         319      47      20
        

        反之亦然:

        table(cut(D$time, breaks = c(0, 4, 12, 40), right=TRUE, include.lowest = TRUE)) 
        

        结果:

         [0,4]  (4,12] (12,40] 
          319      47      20 
        

        两者都意味着您正在寻找的东西:

        [0,4]  [5,12] [13,40] 
         319      47      20
        

        【讨论】:

          猜你喜欢
          • 2011-06-20
          • 2011-09-26
          • 2012-02-13
          • 1970-01-01
          • 1970-01-01
          • 2015-02-01
          • 2019-01-09
          • 1970-01-01
          • 2017-06-18
          相关资源
          最近更新 更多