R 计数每组值增加/减少的数量

R 计数每组值增加/减少的数量,r,tidyverse,R,Tidyverse,我有一个按单位和年份分组的10列df条目。我想计算a)每列值增加的频率和b)每组每列值从一年到另一年(例如从2010年到2011年、2011年到2012年等)减少的频率 这是我的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))

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

这是我的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)))

df一种可产生广泛格式的解决方案。每个
X
s将获得两列新的计数:
X\u incr
X\u 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>
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
df%>%
收集(类型、值、单位、年份)%>%#重塑数据
按(单位、类型)%>%对每个组合进行分组
总结(增量=f#u增量(值),#获得递增计数
decr=f_decr(值))%>%#获取递减计数
排列(类型、单位)%>%#顺序(仅用于可视化目的)
取消分组()#忘记分组
##A tible:2500 x 4
#单位类型递增递减
#      
#11x112
#2 2 X1 1 2
#3x130
#4 4 X1 12
#5 5 X1 3 0
#6x112
#7 X1 1 2
#8x121
#9 X1 12
#10 x12 1
# # ... 还有2490行

我希望我正确理解问题(a)。您试图查看每一行的值增加了多少倍(首先从x1增加到x2,然后从x2增加到x3,依此类推)
我使用apply迭代每一行。然后将第二个到最后一个值覆盖在第一个到第二个到最后一个值上,查看第一个值是否大于或小于第二个值。并将布尔值相加,以查看该行的增加或减少次数。注意从“>”切换到“请添加您的预期输出,是否真的需要有一个1000行的示例来描述您的问题?是否可以减少到10/15行,以便其他人比较其解决方案?使用随机数据时,请使用固定种子。
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)])})
colSums((subset(df, year==2013) - subset(df, year==2012))>0)[3:12]
colSums((subset(df, year==2013) - subset(df, year==2012))<0)[3:12]