为R中的某些值计算数据帧中的行百分比差异

为R中的某些值计算数据帧中的行百分比差异,r,dplyr,R,Dplyr,我有一个如下所示的数据帧: Date Type Count <date> <fct> <int> 1 2018-11-01 B 2 2 2018-11-01 A 4 3 2018-11-02 A 1 4 2018-11-03 A 4 5 2018-11-04 A 3 6 2018-11-05 A 2 7 2018-11-06 C 1 8 2018-11-06 A

我有一个如下所示的数据帧:

Date       Type   Count
<date>     <fct>  <int>
1 2018-11-01 B      2
2 2018-11-01 A      4
3 2018-11-02 A      1
4 2018-11-03 A      4
5 2018-11-04 A      3
6 2018-11-05 A      2
7 2018-11-06 C      1
8 2018-11-06 A      1
9 2018-11-07 A      1

我们可以使用
complete
使用
fill=0
用0填充缺少的
类型
,然后执行计算。这是假设“A”、“B”和“C”的每个
日期最多只有一个值

库(tidyverse)
df%>%
分组单位(日期)%>%
完成(类型,填充=列表(计数=0))%>%
总结(计数=(计数[类型==“A”]-计数[类型==“C”])/总和(计数))
#日期计数
#         
#1 2018-11-01  0.667
#2 2018-11-02  1    
#3 2018-11-03  1    
#4 2018-11-04  1    
#5 2018-11-05  1    
#6 2018-11-06  0    
#7 2018-11-07  1    

我们可以使用
complete
使用
fill=0
用0填充缺少的
类型
,然后执行计算。这是假设“A”、“B”和“C”的每个
日期最多只有一个值

库(tidyverse)
df%>%
分组单位(日期)%>%
完成(类型,填充=列表(计数=0))%>%
总结(计数=(计数[类型==“A”]-计数[类型==“C”])/总和(计数))
#日期计数
#         
#1 2018-11-01  0.667
#2 2018-11-02  1    
#3 2018-11-03  1    
#4 2018-11-04  1    
#5 2018-11-05  1    
#6 2018-11-06  0    
#7 2018-11-07  1    

对于这样的计算,我更喜欢将形状改成宽的形状,这样我就可以直接访问我要进行差异处理的列,即a、B和C列。这有点冗长,但它让我更好地处理数据中的内容

与@Ronak Shah的答案类似,我首先使用类似于
complete
的东西来填充任何缺少的日期和类型组合。我还按组汇总计数,以防对任何日期类型组合有多个观察结果

库(tidyverse)
df_完成百分比
分组依据(日期、类型)%>%
汇总(计数=总和(计数))%>%
解组()%>%
完成(日期、类型、填写=列表(计数=0))
df_完成
#>#A tibble:21 x 3
#>日期类型计数
#>          
#>2018年11月1日A 4
#>2 2018-11-01 B 2
#>3 2018-11-01 C 0
#>4 2018-11-02 A 1
#>5 2018-11-02 B 0
#>6 2018-11-02 C 0
#>7 2018-11-03 A 4
#>8 2018-11-03 B 0
#>9 2018-11-03 C 0
#>10 2018-11-04 A 3
#> # ... 还有11行
然后使用
spread
,我得到每种类型的列,然后进行计算。如果您想像示例中那样格式化为百分比字符串,可以将计数传递到
scales::percent
,例如,它将0.75格式化为75%。然后,您可以除去date和count之外的列,或者在更复杂的情况下,您可能需要进一步重塑

df_完成%>%
排列(键=类型,值=计数)%>%
突变(计数=(A-C)/(A+B+C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>#A tibble:7 x 2
#>日期计数
#>        
#> 1 2018-11-01 67%  
#> 2 2018-11-02 100% 
#> 3 2018-11-03 100% 
#> 4 2018-11-04 100% 
#> 5 2018-11-05 100% 
#> 6 2018-11-06 0%   
#> 7 2018-11-07 100%
细微的变化是使用
rowwise
按每行分组,这允许您在类型列上调用
sum

df_完成%>%
排列(键=类型,值=计数)%>%
行()
突变(计数=(A-C)/和(A,B,C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>来源:本地数据帧[7 x 2]
#>小组:
#> 
#>#A tibble:7 x 2
#>日期计数
#>        
#> 1 2018-11-01 66.7%
#> 2 2018-11-02 100% 
#> 3 2018-11-03 100% 
#> 4 2018-11-04 100% 
#> 5 2018-11-05 100% 
#> 6 2018-11-06 0%   
#> 7 2018-11-07 100%

由(v0.2.1)

于2018年11月28日创建。对于类似的计算,我更喜欢将形状改成宽的形状,这样我就可以直接访问我所取差异的列,即a、B和C列。这有点详细,但它让我更好地处理数据中的内容

与@Ronak Shah的答案类似,我首先使用类似于
complete
的东西来填充任何缺少的日期和类型组合。我还按组汇总计数,以防对任何日期类型组合有多个观察结果

库(tidyverse)
df_完成百分比
分组依据(日期、类型)%>%
汇总(计数=总和(计数))%>%
解组()%>%
完成(日期、类型、填写=列表(计数=0))
df_完成
#>#A tibble:21 x 3
#>日期类型计数
#>          
#>2018年11月1日A 4
#>2 2018-11-01 B 2
#>3 2018-11-01 C 0
#>4 2018-11-02 A 1
#>5 2018-11-02 B 0
#>6 2018-11-02 C 0
#>7 2018-11-03 A 4
#>8 2018-11-03 B 0
#>9 2018-11-03 C 0
#>10 2018-11-04 A 3
#> # ... 还有11行
然后使用
spread
,我得到每种类型的列,然后进行计算。如果您想像示例中那样格式化为百分比字符串,可以将计数传递到
scales::percent
,例如,它将0.75格式化为75%。然后,您可以除去date和count之外的列,或者在更复杂的情况下,您可能需要进一步重塑

df_完成%>%
排列(键=类型,值=计数)%>%
突变(计数=(A-C)/(A+B+C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>#A tibble:7 x 2
#>日期计数
#>        
#> 1 2018-11-01 67%  
#> 2 2018-11-02 100% 
#> 3 2018-11-03 100% 
#> 4 2018-11-04 100% 
#> 5 2018-11-05 100% 
#> 6 2018-11-06 0%   
#> 7 2018-11-07 100%
细微的变化是使用
rowwise
按每行分组,这允许您在类型列上调用
sum

df_完成%>%
排列(键=类型,值=计数)%>%
行()
突变(计数=(A-C)/和(A,B,C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>所以
Date          Count
<date>        <int>
1 2018-11-01    66.7%
2 2018-11-02   some %
3 2018-11-03   some %
4 2018-11-04   some %
5 2018-11-05   some %
6 2018-11-06   some %
7 2018-11-07   some %
abc %>% group_by(DATE) %>%
arrange(DATE) %>%
mutate(diff = n - lag(n, default = first(n)))
library(tidyverse)
df %>%
  group_by(Date) %>%
  complete(Type, fill = list(Count = 0)) %>%
  summarise(Count = (Count[Type == "A"] - Count[Type == "C"])/sum(Count))


#       Date   Count
#  <fct>       <dbl>
#1 2018-11-01  0.667
#2 2018-11-02  1    
#3 2018-11-03  1    
#4 2018-11-04  1    
#5 2018-11-05  1    
#6 2018-11-06  0    
#7 2018-11-07  1