通过多个分组添加变量计数

时间:2016-07-10 22:28:40

标签: r dplyr

免责声明 - 标题可能会产生误导 - 我认为我没有找到解决方案的部分原因是我不知道该如何去谷歌。

我有一个扩展格式的组级数据集;年份和国家代码重复每个组(id),如下面(手动输入)

melt(df[, -5, with = FALSE][, rn := 1:.N], id.var= 'rn')[, 
   variable[order(-value[!duplicated(value, fromLast=TRUE)])][2] , rn]$V1
#[1] B C A A

我想在末尾添加国家/地区年份计数作为列,因此它看起来像下面的

year   country  id  v1  v2  v3
1991   20       1    1   0   0
1991   20       2    0   1   0
1991   20       3    0   0   1
1991   20       4    1   0   0
1991   20       5    1   0   0
1991   20       6    0   1   0

我已尝试year country id v1 v2 v3 v1.count v2.count v3.count 1991 20 1 1 0 0 3 2 1 1991 20 2 0 1 0 3 2 1 1991 20 3 0 0 1 3 2 1 1991 20 4 1 0 0 3 2 1 1991 20 5 1 0 0 3 2 1 1991 20 6 0 1 0 3 2 1 aggregatecount但没有成功。我认为Group by and conditionally countFrequency count for a specific category可能会成功,但我无法让它发挥作用。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:1)

在按“年份”和“国家/地区”分组后,我们可以使用mutate_each中的dplyr

df1 %>%
   group_by(year, country) %>%
   mutate_each(funs(count = sum), v1:v3)
 #  year country    id    v1    v2    v3 v1_count v2_count v3_count
 #  <int>   <int> <int> <int> <int> <int>    <int>    <int>    <int>
 #1  1991      20     1     1     0     0        3        2        1
 #2  1991      20     2     0     1     0        3        2        1
 #3  1991      20     3     0     0     1        3        2        1
 #4  1991      20     4     1     0     0        3        2        1
 #5  1991      20     5     1     0     0        3        2        1
 #6  1991      20     6     0     1     0        3        2        1

答案 1 :(得分:0)

我猜您也可以只使用mutate

df1 <- read.table(text="year   country  id  v1  v2  v3
1991   20       1    1   0   0
1991   20       2    0   1   0
1991   20       3    0   0   1
1991   20       4    1   0   0
1991   20       5    1   0   0
1991   20       6    0   1   0", head=T, as.is=T)

df1

library(dplyr)

df1 %>% group_by(year, country) %>% 
  mutate(v1.count=sum(v1), v2.count=sum(v2), v3.count=sum(v3))
# Source: local data frame [6 x 9]
# Groups: year, country [1]

#    year country    id    v1    v2    v3 v1.count v2.count v3.count
#   (int)   (int) (int) (int) (int) (int)    (int)    (int)    (int)
# 1  1991      20     1     1     0     0        3        2        1
# 2  1991      20     2     0     1     0        3        2        1
# 3  1991      20     3     0     0     1        3        2        1
# 4  1991      20     4     1     0     0        3        2        1
# 5  1991      20     5     1     0     0        3        2        1
# 6  1991      20     6     0     1     0        3        2        1