首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最大值,将其分组,然后取R中的原始计数。

获取最大值,将其分组,然后取R中的原始计数。
EN

Stack Overflow用户
提问于 2016-03-15 17:07:07
回答 3查看 959关注 0票数 2

我的数据如下,

代码语言:javascript
复制
df <- read.table(text="Name   value
A        0
                 A        1
                 A        2
                 A        3
                 B        0
                 B        0
                 B        3
                 C        5", header=T)

> df
  Name value
1    A     0
2    A     1
3    A     2
4    A     3
5    B     0
6    B     0
7    B     3
8    C     5

我最初想给每个名称的最大值分配回收箱,因此我这样做了,

代码语言:javascript
复制
p = df %>% group_by(Name) %>% summarise(k =max(value))
p$values <- as.character(cut(p$k, breaks=c(0,1,2,3,4,5,10), labels=c("0-1","1-2","2-3","3-4","4-5","5-10")))

得到以下输出,

代码语言:javascript
复制
> p
Source: local data table [3 x 3]

    Name     k values
  (fctr) (int)  (chr)
1      A     3    2-3
2      B     3    2-3
3      C     5    4-5

现在,我想通过值对其进行分组,以查看回收箱的拆分。因此我尝试了以下几点,

代码语言:javascript
复制
> p %>% group_by(values) %>% summarise(n())
Source: local data table [2 x 2]

  values   n()
   (chr) (int)
1    2-3     2
2    4-5     1

现在在2-3个垃圾箱里,计数是2,它是A& B,在4-5里面,计数是1,C在后面。现在,我想在这个输出中添加另一列。输出应该是原始dataframe第一行中A和B的总行以及第二行中C行的行数。

我想要的输出是,

代码语言:javascript
复制
  values   n()   totalcount
   (chr) (int)
1    2-3     2       6
2    4-5     1       1

其中6和1是n()计数中的行数。我被困在创建第三栏中。有人能帮我或者给我一些建议吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-15 17:57:52

我们可以在管道(%>%)中完成大部分作业。例如,使用p$values <- ...代替mutate来创建“values”列。在按'values‘分组之后,我们再次使用mutate来创建'n’,这样'Name‘列将保留在dataset中,它将作为一个公共变量在left_join中与原始数据集('df')一起使用。之后,我们使用join,使用summarise获取'n‘的first值和按’value‘分组的行数(’总和‘)。

代码语言:javascript
复制
df %>% 
   group_by(Name) %>%
   summarise(k=max(value)) %>% 
   mutate(values = cut(k, breaks= c(0,1,2,3,4,5,10), 
          labels=c("0-1","1-2","2-3","3-4","4-5","5-10"))) %>% 
   group_by(values) %>%
   mutate(n=n()) %>% 
   left_join(., df, by ='Name') %>%
   group_by(values) %>%
   summarise(n=first(n), totalcount=n())
#  values     n totalcount
#   (fctr) (int)      (int)
#1    2-3     2          7
#2    4-5     1          1
票数 1
EN

Stack Overflow用户

发布于 2016-03-15 17:58:27

我觉得用data.table做这种事更容易

代码语言:javascript
复制
# convert to data table
library(data.table)             
dt <- data.table(df)

# find max by Name
p <- dt[, list(k=max(value)), by='Name']

# label maxes
breaks <- c(0,1,2,3,4,5,10)
labels <- c("0-1","1-2","2-3","3-4","4-5","5-10")
for (b in breaks) p[k==b, values:=labels[breaks==b]]

# count the Names within each bin
n <- p[, list(n=.N), by='values']

# count rows in original data table by bin
dt <- merge(dt, p, 'Name')
totalcount <- dt[, list(totalcount=.N), by='values']

# assemble n and totalcount to produce final output
n <- merge(n, totalcount, 'values')
票数 2
EN

Stack Overflow用户

发布于 2016-03-16 00:40:54

下面是另一个data.table实现:

代码语言:javascript
复制
dt[, .(N=.N, value=max(value)), Name 
   ][, bin := cut(value,
                  breaks=c(0,1,2,3,4,5,10),
                  labels=c("0-1","1-2","2-3","3-4","4-5","5-10"))
   ][, .(N=.N, NRows=sum(N)), bin
   ]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36017727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档