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