首页 文章

计算每个站点的标签并在R中创建汇总表[重复]

提问于
浏览
2

这个问题在这里已有答案:

以下是与我的数据集类似的部分内容:

require(dplyr)
alldata
site    date    percent_rank    Label
01A  2013-01-01    0.32         Normal
01B  2013-01-01    0.12         Low
01C  2013-01-01    0.76         High
02A  2013-01-01     0           N/A
02B  2013-01-01    0.16         Low
02C  2013-01-01    0.5          Normal
01A  2013-01-02    0.67         Normal
01B  2013-01-02    0.01         Low
01C  2013-01-02    0.92         High

我根据值为每个percent_rank分配了一个标签(三个类别为0到0.25到0.75到1) . 我现在想以这种格式生成一个汇总表:

site  Low  Normal  High  Missing
01A   32   47      92    194
01B   232  23      17    93
01C   82   265     12    6

其中每个站点将计算具有该站点标签的所有日期的低值,正常值和高值的出现次数(一年中的每一天都有一个),并且“丢失”将计算N / A值柱 .

我尝试过以下方法:

alldata <- %>% group_by(site) %>% mutate(length(Label == "Low"))

它返回所有记录的总值,而不是每个站点的“低”计数,以及

alldata <- %>% group_by(site) %>% mutate(length(which(Label == "Low")))

它返回的值比记录总数高几千 . 我的想法是,我会重复这个函数来创建四个新的列,其中包含四个单独的mutate行(每个类别一个),这将产生我的汇总表 . 我也试过了aggregate()的一些变体,虽然函数组件对于我的目标不太清楚 . 这似乎应该是一个非常简单的事情(group_by很好地计算了百分比等级和相关标签)但我还没有找到解决方案 . 任何提示都非常感谢!

3 回答

  • 0

    我们可以使用来自 data.tabledcast ,它也有 fun.aggregate 并且非常快 .

    library(data.table)
    dcast(setDT(alldata), site~Label, length)
    

    或使用 dplyr/tidyr

    library(dplyr)
    library(tidyr)
    alldata %>%
        group_by(site, Label) %>%
        tally() %>%
        spread(Label, n)
    

    base R 选项将是

    reshape(aggregate(date~site + Label, alldata, length), 
               idvar = "site", timevar="Label", direction="wide")
    
  • 1

    dplyr 中有三种方法可以做到这一点 . 第一个是最冗长的,另外两个使用便捷函数来缩短代码:

    library(reshape2)
    library(dplyr)
    
    alldata %>% group_by(site, Label) %>% summarise(n=n()) %>% dcast(site ~ Label)
    
    alldata %>% group_by(site, Label) %>% tally %>% dcast(site ~ Label)
    
    alldata %>% count(site, Label) %>% dcast(site ~ Label)
    
  • 1

    要生成摘要表,可以使用 table

    with(df, table(site, Label, useNA="ifany"))[, c(2,4,1,3)]
    
         Label
    site  Low Normal High N/A
      01A   0      2    0   0
      01B   2      0    0   0
      01C   0      0    2   0
      02A   0      0    0   1
      02B   1      0    0   0
      02C   0      1    0   0
    

    data

    df <- read.table(header=T, text="site    date    percent_rank    Label
    01A  2013-01-01    0.32         Normal
    01B  2013-01-01    0.12         Low
    01C  2013-01-01    0.76         High
    02A  2013-01-01     0           N/A
    02B  2013-01-01    0.16         Low
    02C  2013-01-01    0.5          Normal
    01A  2013-01-02    0.67         Normal
    01B  2013-01-02    0.01         Low
    01C  2013-01-02    0.92         High")
    

相关问题