【问题标题】:How do I melt or reshape binned data in R? [duplicate]如何融化或重塑 R 中的分箱数据? [复制]
【发布时间】:2015-11-05 16:21:28
【问题描述】:

我已经对反映每个大陆的河流宽度的数据进行了分类。下面是一个示例数据集。我几乎只是想将数据放入我显示的表格中。

 dat <- read.table(text =    
                      "width continent bin
                      5.32     Africa  10
                      6.38     Africa  10
                      10.80    Asia    20
                      9.45     Africa  10
                      22.66    Africa  30
                      9.45     Asia    10",header = TRUE)

如何融合上述玩具数据集以创建此数据框?

Bin Count Continent
10  3     Africa
10  1     Asia
20  1     Asia
30  1     Africa

【问题讨论】:

    标签: r aggregate reshape melt


    【解决方案1】:

    我们可以按组使用其中任一聚合。

    data.table 选项是将“data.frame”转换为“data.table”(setDT(dat)),按“continent”和“bin”变量分组,我们得到每组的元素数( .N)

    library(data.table)
    setDT(dat)[,list(Count=.N) ,.(continent,bin)]
    #    continent bin Count
    #1:    Africa  10     3
    #2:      Asia  20     1
    #3:    Africa  30     1
    #4:      Asia  10     1
    

    或与dplyr 类似的选项,通过对变量进行分组,然后使用n() 而不是.N 来获取计数。

     library(dplyr)
     dat %>%
          group_by(continent, bin) %>%
          summarise(Count=n())
    

    或者我们可以使用base R中的aggregate,并使用公式方法,我们得到length

     aggregate(cbind(Count=width)~., dat, FUN=length)
     #   continent bin Count
     #1    Africa  10     3
     #2      Asia  10     1
     #3      Asia  20     1
     #4    Africa  30     1
    

    来自@Frank 和@David Arenburg 的cmets,一些使用data.tabledplyr 的附加选项。我们将数据集转换为data.table (setDT(dat)),使用dcast 转换为“宽”格式,然后使用melt 将其重新转换回“长”格式,并将roww (value&gt;0) 子集化

     library(data.table)
     melt(dcast(setDT(dat),continent~bin))[value>0]
    

    使用来自dplyrcount

     library(dplyr)
     count(dat, bin, continent)
    

    【讨论】:

    • 为了使用标题中提到的meltsetDT(melt(dcast(dat,continent~bin)))[value&gt;0]
    • 还有count(dat, bin, continent)
    【解决方案2】:

    sqldf:

    library(sqldf)
    sqldf("SELECT bin, continent, COUNT(continent) AS count 
          FROM dat 
          GROUP BY bin, continent")
    

    输出:

      bin continent count
    1  10    Africa     3
    2  10      Asia     1
    3  20      Asia     1
    4  30    Africa     1
    

    【讨论】:

    • 你可以加sqldf
    • @akrun 再次感谢您
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多