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

时间:2016-06-21 18:30:00

标签: r dplyr tidyr

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

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"))

返回所有记录的总值,而不是&#34; Low&#34;每个网站,

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

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

3 个答案:

答案 0 :(得分: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 :(得分: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

数据

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")

答案 2 :(得分:0)

我们可以使用dcast中的data.tablefun.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") 选项

@IBOutlet weak var brokeView: UIView!