我的数据如下,
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我最初想给每个名称的最大值分配回收箱,因此我这样做了,
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")))得到以下输出,
> 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现在,我想通过值对其进行分组,以查看回收箱的拆分。因此我尝试了以下几点,
> 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行的行数。
我想要的输出是,
values n() totalcount
(chr) (int)
1 2-3 2 6
2 4-5 1 1其中6和1是n()计数中的行数。我被困在创建第三栏中。有人能帮我或者给我一些建议吗?
谢谢
发布于 2016-03-15 17:57:52
我们可以在管道(%>%)中完成大部分作业。例如,使用p$values <- ...代替mutate来创建“values”列。在按'values‘分组之后,我们再次使用mutate来创建'n’,这样'Name‘列将保留在dataset中,它将作为一个公共变量在left_join中与原始数据集('df')一起使用。之后,我们使用join,使用summarise获取'n‘的first值和按’value‘分组的行数(’总和‘)。
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发布于 2016-03-15 17:58:27
我觉得用data.table做这种事更容易
# 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')发布于 2016-03-16 00:40:54
下面是另一个data.table实现:
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
]https://stackoverflow.com/questions/36017727
复制相似问题