每组价值增加/减少的数量

时间:2018-08-15 11:09:44

标签: r tidyverse

我有一个df,其中包含按单位和年份分组的10列的条目。我想计算a)每组从一年到另一年(例如从2010年到2011年,从2011年到2012年等等)每列的值增加一次的频率和b)每列的值减少一次的频率。

这是我的df

df <- data.frame(unit=rep(1:250, 4),  
             year=rep(c(2012, 2013, 2014, 2015), each=250),
             replicate(10,sample(0:50000,1000,rep=TRUE)))

因此,解决方案应显示X1中单元1从一年到另一年增加和减少的频率,X2中单元1增加/减少的频率等等。

最好使用tidyverse解决方案;)

2 个答案:

答案 0 :(得分:1)

一种产生宽格式的解决方案。 X中的每一个将获得2个新的计数列:X_incrX_decr

# example data
df <- data.frame(unit=rep(1:250, 4),  
                 year=rep(c(2012, 2013, 2014, 2015), each=250),
                 replicate(10,sample(0:50000,1000,rep=TRUE)))

library(dplyr)

# function to count increases and decreases
f_incr = function(x) sum(lead(x) > x, na.rm = T)
f_decr = function(x) sum(lead(x) < x, na.rm = T)


df %>%
  group_by(unit) %>%                                     # for each unit
  summarise_at(vars(matches("X")), funs(incr = f_incr,   # apply functions
                                        decr = f_decr))

# # A tibble: 250 x 21
#    unit X1_incr X2_incr X3_incr X4_incr X5_incr X6_incr X7_incr X8_incr X9_incr X10_incr X1_decr X2_decr
#   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>    <int>   <int>   <int>
# 1     1       1       0       2       1       1       1       1       1       2        2       2       3
# 2     2       1       2       1       2       0       1       1       3       2        2       2       1
# 3     3       3       1       1       1       2       1       1       2       2        2       0       2
# 4     4       1       1       2       1       1       1       1       1       2        1       2       2
# 5     5       3       2       2       1       2       2       1       2       2        2       0       1
# 6     6       1       2       1       2       2       2       1       2       2        1       2       1
# 7     7       1       2       1       1       2       0       2       3       1        1       2       1
# 8     8       2       1       1       2       2       1       1       2       1        1       1       2
# 9     9       1       2       3       1       2       2       1       1       2        2       2       1
#10    10       2       1       2       2       2       2       0       1       2        1       1       2
# # ... with 240 more rows, and 8 more variables: X3_decr <int>, X4_decr <int>, X5_decr <int>, X6_decr <int>,
# #   X7_decr <int>, X8_decr <int>, X9_decr <int>, X10_decr <int>

或者,如果您更喜欢一种格式,其中每个X都有两行计数(X_incrX_decr):

library(tidyr)

df %>%
  group_by(unit) %>%                                     
  summarise_at(vars(matches("X")), funs(incr = f_incr,   
                                        decr = f_decr)) %>%
  gather(type, counts, -unit)

# # A tibble: 5,000 x 3
#    unit type    counts
#   <int> <chr>    <int>
# 1     1 X1_incr      1
# 2     2 X1_incr      1
# 3     3 X1_incr      3
# 4     4 X1_incr      1
# 5     5 X1_incr      3
# 6     6 X1_incr      1
# 7     7 X1_incr      1
# 8     8 X1_incr      2
# 9     9 X1_incr      1
#10    10 X1_incr      2
# # ... with 4,990 more rows

或者这个:

df %>%
  gather(type,value,-unit,-year) %>%   # reshape data
  group_by(unit, type) %>%             # for each combination
  summarise(incr = f_incr(value),      # get increasing counts
            decr = f_decr(value)) %>%  # get decreasing counts
  arrange(type, unit) %>%              # order (just for visualisation purposes)
  ungroup()                            # forget the grouping

# # A tibble: 2,500 x 4
#    unit type   incr  decr
#   <int> <chr> <int> <int>
# 1     1 X1        1     2
# 2     2 X1        1     2
# 3     3 X1        3     0
# 4     4 X1        1     2
# 5     5 X1        3     0
# 6     6 X1        1     2
# 7     7 X1        1     2
# 8     8 X1        2     1
# 9     9 X1        1     2
#10    10 X1        2     1
# # ... with 2,490 more rows

答案 1 :(得分:0)

我希望我正确理解了问题(a)。您尝试查看每一行的值增加了多少倍(首先从x1到x2,然后从x2到x3,依此类推) 我正在使用Apply遍历每一行。然后将第二个至最后一个值覆盖在第一个至倒数第二个值上,看看它们是否大于或小于第二个。然后将布尔值相加即可得出该行增加或减少的次数。注意从“>”切换到“ <”

increases <- apply(df[,3:12], 1, function(x) {sum(x[2:length(x)] > x[1:(length(x)-1)])})
decreases <- apply(df[,3:12], 1, function(x) {sum(x[2:length(x)] < x[1:(length(x)-1)])})

对于问题(b),您可以从年等于2013的子集中减去年等于2012的子集,并测试值的增大是否大于0,减小的值小于0。然后使用colSums查看增加或减少多少个“单位”。

增加:

colSums((subset(df, year==2013) - subset(df, year==2012))>0)[3:12]

减少:

colSums((subset(df, year==2013) - subset(df, year==2012))<0)[3:12]