以下是与我的数据集类似的部分内容:
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很好地计算了百分比排名和相关标签)但我还没有找到解决方案。任何提示都非常感谢!
答案 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.table
,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")
选项
@IBOutlet weak var brokeView: UIView!